前言

之前工作中整理的一篇编码规范。

代码注释

注释约定

只在需要的地方加注释,不要为显而易见的代码加注释

使用 /// 生成的xml标签格式的文档注释

方法注释

所有的方法都应该以描述这段代码的功能的一段简明注释开始(方法是干什么)。这种描述不应该包括执行过程细节(它是怎么做的)

/// <summary>
/// 把对象类型转化为指定类型
/// </summary>
/// <typeparam name="T">动态类型 </typeparam>
/// <param name="value">要转化的源对象 </param>
/// <returns> 转化后的指定类型的对象,转化失败引发异常。</returns>
public static T CastTo<T>(this object value)

代码行注释

如果某一功能需要多行代码,并有多个逻辑结构,应在此代码前添加注释,说明此块代码的处理思路及注意事项等

注释从新行增加,与代码开始处左对齐

注释双斜线与注释之间以空格分开,示例如下:

public void Dispose(){
// 如果连接已打开,则关闭连接并释放资源
if(this.connection.State == ConnectionState.Open ){
this.connection.Close();
this.connection.Dispose();
}
}

变量注释

变量需添加注释,说明变量的用途

Class级变量使用 /// 生成的Xml标签格式的文档注释

/// <summary>
/// 文档名称
/// </summary>
public static string docName = "";

方法级的变量注释可以放在变量声明语句后,与上下行的注释左对齐,注释与代码间以 Tab 键分隔

public void CreateDoc() {
string docType = ""; //文档类型
string author = ""; //作者
DateTime createDate = DateTime.Now; //创建世界
}

命名规范

命名基本约定

PascalCasing:

包含一个或多个单词,每个单词首字母大写,其余小写

使用范围:命名空间、类、接口、方法、属性、事件、非私有字段、枚举值

namespace System.IO
public static class Console
public enum FileAccess

camelCasing:

包含一个或多个单词,第一个单词首字母小写,其余单词首字母大写

使用范围:方法参数、局部变量

public string GetName(int productId){
string productName = null;
}

_camelCasing:

"_"+camelCasing的方式

使用范围:私有字段

private string _productName;

UPPER_CAPS:

包含多个单词,每个单词的所有字母大写,单词之间使用"_"连接

使用范围:const常量

public const string DEFAULT_NAME = "default";

示例:

namespace ConsoleApp {
public delegate void SalesOutEventHandler(); public class Product {
public event SalesOutEventHandler OnSalesOut; public Product GetProductById(int productId) {
return null;
} private enum ProductType {
}
}
}

标识符命名约定

类和接口

类的名字使用名词

避免使用单词缩写,除非是广为人知的,比如: HTTP , IO

接口以 I 字母开头

同一项目不同命名空间中的类,命名避免重复

方法

第一个单词为动词

返回值为 bool 类型,则加 Is , Can , Try前缀

变量

尽量使用短而有意义的单词

单字符变量名一般用于生命周期非常短的变量,如 for , foreach 中递增变量可以被命名为 i

如果变量表示集合,则变量名使用复数,如 RowsCount

命名控件使用匈牙利命名法,前缀遵循同一个缩写表

在带单位的值变量后加“_camelCasing”格式的单位,如: public void CreateCache(int cacheSize_mb)

类型成员排列顺序

类型成员的排列顺序自上而下依次为:

字段: 私有字段、受保护字段

属性: 私有属性、受保护属性、公有属性

事件: 私有事件、受保护事件、公有事件

构造函数: 参数数量最少的构造函数,参数数量中等的构造函数,参数数量最多的构造函数

方法: 重载方法的排列顺序与构造函数相同,从参数数量最少往下至参数最多

其他规范

代码长度

每行代码不宜过长,应在屏幕宽度之内,约为80-120个字符左右。换行规则如下:

在逗号后换行

在操作符后换行

在高层换行而不是在低层换行

换行后与上一行语句对齐

推荐写法:

var n = a * b / (c - g + f) +
4 * z;

不推荐写法:

var n = a * b / (c - g +
f) + 4 * z;

方法行数

每个方法的有效代码行数(不包括注释和空行)应保持在50行以内

空白

空行是为了将逻辑相关的代码分块,以便提高阅读性

在以下情况使用两个空行:

类声明和接口声明之间

两个类声明之间

枚举与类声明之间

在以下情况使用一个空行:

方法与方法、属性与属性之间

方法中变量声明与语句之间

方法与方法之间

方法不同逻辑块之间

类中属性与方法、属性与字段、方法与字段之间

注释与它注释的语句之间不空行,与其他语句之间空一行

在以下情况使用空格:

在VS编辑器中可以使用快捷键格式化代码

参数列表的逗号后,void UpdateDate(int a, int b)

二元操作符,a += b - c;

强制类型转换后,c = (char) a;

代码缩进

代码缩进使用Tab键,不要使用空格,Tab键的宽度为4个字符,VS中设置如下:

【工具】-【选项】-【文本编辑器】-【C#】-【制表符】,选中【保留制表符】

代码半展开

把花括号放在前一条语句的末尾,VS中设置如下:

【工具】-【选项】-【文本编辑器】-【C#】-【格式设置】-【新行】,取消右侧所有勾选

附录

注释内容

项目 注释内容
类的目的,开发历史
接口 接口的目的,如何使用
字段/属性 字段描述
方法注释 方法作用,返回值,抛出的异常,调用的前提和后置条件
方法内部注释 控制结构,复杂的代码,处理顺序
参数 用来做什么,约束,前提条件
局部变量 用处,目的

XML文档注释

MSDN文档注释标签 https://msdn.microsoft.com/zh-cn/library/5ast78ax(v=vs.140).aspx

标记 说明
<c> 提供了一种将说明中的文本标记为代码的方法
<code> 提供了一种将多行指示为代码的方法
<example> 可以指定使用方法或其他库成员的示例。一般情况下,这将涉及到<code>标记的使用。
<exception> 对可从当前编译环境中获取的异常的引用。
<include> 引用描述源代码中类型和成员的另一文件中的注释。
<list> 用于定义表或定义列表中的标题行。
<para> 用于诸如<summary>、<remarks> 或 <returns> 等标记内,使您将结构添加到文本中。
<param> 应当用于方法声明的注释中,以描述方法的一个参数。
<paramref> 提供了一种指示词为参数的方法。
<permission> 将成员的访问记入文档。
<remarks> 用于添加有关某个类型的信息,从而补充由 <summary> 所指定的信息。
<returns> 应当用于方法声明的注释,以描述返回值。
<see> 从文本内指定链接。
<seealso> 对可以通过当前编译环境进行调用的成员或字段的引用。
<summary> 应当用于描述类型或类型成员。
<value> 描述属性。

VS常用快捷键

功能 VS2010 VS2013 说明
文档格式化 Ctrl+E, Ctrl+D Ctrl+K, Ctrl+D 格式化当前文档
选定内容格式化 Ctrl+E, Ctrl+F Ctrl+K, Ctrl+F 格式化选中内容
注释 Ctrl+E, Ctrl+C Ctrl+K, Ctrl+C 注释当前行
取消注释 Ctrl+E, Ctrl+U Ctrl+K, Ctrl+U 取消注释当前行
复制 Ctrl+C - 复制光标所在行,不需要选中
剪切 Ctrl+X - 剪切光标所在行,不需要选中
删除 Ctrl+L - 删除光标所在行,不需要选中
折叠 - Ctrl+M, Ctrl+O 折叠当前文档
展开折叠 - Ctrl+M, Ctrl+L 展开当前文档

参考

MSDN开发语言和工具 https://msdn.microsoft.com/zh-cn/library/aa187916.aspx

C#语言规范 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\2052\CSharp Language Specification.docx

C#格式规范的更多相关文章

  1. OverWatch团队文档格式规范

    V1.0 最终修改于2016/10/19 概述 软件工程中,一份优雅的文档不仅能降低团队成员之间的沟通难度,而且能给之后的开发者提供一个非常有效的引导.本团队为了规范整个项目中文档的格式,便于统一管理 ...

  2. GeoJSON格式规范说明

    GeoJSON格式规范说明 1.简介 GeoJSON是一种对各种地理数据结构进行编码的格式.GeoJSON对象可以表示几何.特征或者特征集合.GeoJSON支持下面几何类型:点.线.面.多点.多线.多 ...

  3. IOS格式规范

    IOS格式规范 目录 概述 日期格式 NSDateFormatter格式说明 概述 日期格式 声明时间格式:NSDateFormatter *date_formatter = [[NSDateForm ...

  4. NFC(10)NDEF uri格式规范及读写示例(解析与封装ndef uri)

    只有遵守NDEF uri 格式规范的数据才能写到nfc标签上. NDEF uri 格式规范 uri 只有两部分: 第1个字节是uri协议映射值,如:0x01 表示uri以 http://www.开头. ...

  5. NFC(9)NDEF文本格式规范及读写示例(解析与封装ndef 文本)

    只有遵守NDEF文本格式规范的数据才能写到nfc标签上. NDEF文本格式规范 不管什么格式的数据本质上都是由一些字节组成的.对于NDEF文本格式来说. 1,这些数据的第1个字节描述了数据的状态, 2 ...

  6. WEB学习笔记4-前端代码基本命名规法和格式规范

    1.HTML命名规范及格式规范 标签名和属性应该都小写,虽然HTML代码不区分大小写:属性值应该用双引号闭合. <IMG src=demo.jpg alt='test'/>(N) < ...

  7. (转载)将一段符合XML格式规范字符串插入已有XML文档当中

    想我们已经存在一个XML文档,结构如下:   < xmlversion="1.0"encoding="utf-8">< employees&g ...

  8. 理解CSV格式规范(解析CSV必备)

    什么是CSV逗号分隔值(Comma-Separated Values,CSV),其文件以纯文本形式存储表格数据(数字和文本),文件的每一行都是一个数据记录.每个记录由一个或多个字段组成,用逗号分隔.使 ...

  9. Linux:可执行程序的Shell传参格式规范

    1. Linux下可执行程序的Shell传参格式规范 Linux下的可执行程序在运行时经常需要传一些参数,而这些参数是有规范的.包括我们自己写的在Linux系统下运行的Shell脚本.Python脚本 ...

  10. XML学习笔记(二)-- DTD格式规范

    标签(空格分隔): 学习笔记 XML的一个主要目的是允许应用程序之间自由交换结构化的数据,因此要求XML文档具有一致的结构.业务逻辑和规则.可以定义一种模式来定义XML文档的结构,并借此验证XML文档 ...

随机推荐

  1. sql 百万级或千万级数据分页处理

    笔记来源 https://blog.csdn.net/zhenyuanjie/article/details/7778102

  2. C++探究foreach算法

    for_each在algorithm.h 中 template<class _InIt, class _Fn1> inline _Fn1 for_each(_InIt _First, _I ...

  3. mac virtualbox 安装

    在Mac上装virtualbox提示安装失败!!! 安全性与隐私的通用下点击允许!!!

  4. Buffer cache hit ratio性能计数器真的可以作为SQL Server 内存瓶颈的判断指标吗?

    SQL Server中对于Buffer cache hit ratio的理解: Buffer cache hit ratio官方是这么解释的:“指示在缓冲区高速缓存中找到而不需要从磁盘中读取的页的百分 ...

  5. 安装stress模拟linux系统资源消耗

    1.安装yum源:yum install epel-release -y 2.安装stress:yum install stress -y 3.使用样例:stress -c 1 -t 60 4.测试场 ...

  6. 【洛谷4770】 [NOI2018]你的名字(SAM,线段树合并)

    传送门 洛谷 Solution 做过的比较玄学的后缀自动机. 果然就像\(Tham\)所讲,后缀自动机这种东西考场考了不可能做的出来的... 考虑如果\(l=1,r=|S|\)的怎么做? 直接建后缀自 ...

  7. Java代码审计入门篇

    作者:i春秋核心白帽yanzmi 原文来自:https://bbs.ichunqiu.com/thread-42149-1-1.html 本期斗哥带来Java代码审计的一些环境和工具准备. Java这 ...

  8. Javascript高级编程学习笔记(12)—— 引用类型(1)Object类型

    前面的文章中我们知道JS中的值分为两种类型 基础类型的值和引用类型的值 基础类型的值我已经大概介绍了一下,今天开始后面几天我会为大家介绍一下引用类型的值 Object类型 对象是引用类型的值的实例,在 ...

  9. 第十节:详细讲解一下Java多线程,随机文件

    前言 大家好,给大家带来第十节:详细讲解一下Java多线程,随机文件的概述,希望你们喜欢 多线程的概念 线程的生命周期 多线程程序的设计 多线程的概念 多线程的概念:程序是静态的,进程是动态的.多进程 ...

  10. java相关技术问答(二)

    String为什么是final的 首先是为了安全性,final表示不可变,不可被继承,不能修改其方法保证安全 在多线程环境下,final类型的String保证线程安全 String支持字符串常量池,相 ...