C#代码规范精简表
一、 目的
- 为了统一公司软件开发设计过程的编程规范
- 使开发人员能很方便的理解每个目录,变量,控件,类,方法的意义
- 为了保证编写出的程序都符合相同的规范,保证一致性、统一性而建立的程序编码规范。
- 编码规范和约定必须能明显改善代码可读性,并有助于代码管理、分类范围适用于企业所有基于.NET平台的软件开发工作
二、 范围
本规范适用于.NET开发人员,作用于软件项目开发的代码编写阶段和后期维护阶段。
三、 注释规范
- 公共类型必须添加注释,详细请参考命名规范例子所示:
- 修改BUG需要改变代码时必须添加注释,包含改动时间,BUG编号,修改原因等信息如下所示:
//改动人:### 改动时间:### Bug编号:##:修改内容:###
- 核心逻辑代码必须要有注释
例如:
If(string.Compare(str1,str2).E quase(0))
{
A ab=new A;
/*
以下代码包含:
1:从库存查询结果
2: 按 结果拆分为消耗品和 再生品
3:导出到Excel
*/
…
}
四、 命名规范
- 名字应该能够标识事物的特性。
- 类名以、方法名称、公共属性 首写字母必须大写,并只能由字母组成。类变量以m_## 组成,方法体变量以 _## 组成。
例:
///<summary>
///新Bug实体类
///<summary>
public class NewBugInstance()
{
private string m_BugInstance;//局部变量规范
///<summary>
///公共字段模板
///<summary>
public string BugInstance
{
get;
set;
}
///<summary>
///公共字段模板
///<summary>
public bool Equase()
{
int _Temp;//方法体变量模板
//修改人:张三,修改时间:2012-0604,Bug编号:BUG123,修改内容:将字符串比较时的”==”改成string.Compare()或者String.Equase().
If(string.Compare(str1,str2).Equase(0))
{
}
}
}
- 基础命名规范
抽象基类 | -Base | 示例:SessionBase |
接口 | I- | 示例:ICheckMethod |
异常 | -Exception | 示例:SocketException |
x | -EventArgs | 示例:DoWhereEventArgs |
事件委托 | -EventHandler | 示例:DoWhereEventHandler |
特性 | -Attribute | 示例:DataNameAttribute |
泛型类型参数 | T- | 示例:TSession,TCurSession |
- 窗体命名以Frm_###。
///<summary>
///添加人物窗口
///<summary>
public class Frm_AddName
{
}
- 常量必须由大写字母组成,有二个以上单词的以下划线分开。
如:
DATA_TEMPLATE_NAME = ”数据模板名字”;
五、 异常处理规范
- 异常处理时catch模块必须添加日志记录否则应加对应的注释说明不需要日志的原因。并避免直接使用Exception日志类型为Error类型
- 关键代码记录日志为Information 类型。
try
{
}catch
{
//字符串转数字检查,不需要记录日志。
}
try
{
Log.Information(“程序已正常完成”);
}catch(ArgumentNullException ex)
{
Log.Error(ex);
}
六、 性能规范
- 方法返回类型不应该为Object类型。
- 字符串比较时不要使用ToLower或者ToUpper string 比较建议使用string.Compare 或者Equals。
例:应将
if(str.Tostring().Tolower()==str1.Tostring().Tolower())
改成
if(string.Compare(str,str1,false).Equase(0))
或者
str.Equase(str1, StringComparison.CurrentCultureIgnoreCase)
字符串为空判断时使用string. IsNullOrEmpty。
例:应将:if(str==string.Empty|| str == null) 或if(str==””)
改成:if(string.IsNullOrEmpty(str))
- 使用StringBuilder 代替“+”进行字符串串联。
例:
应将:
String _str = “123”;
For(int i=0 i<10000;i++)
{
Str+=str;
}
改成
StringBuilder _strBuilder = new StringBuilder(“123”);
For(int i=0 i<10000;i++)
{
_strBuilder.Append(“123”);
}
- 考虑使用string.Format()方法而不是字符串拼接来输出结果。
- 检测空字符串用string.IsNullOrEmpty
七、 设计规范
- 一个方法体内代码行数不应超过100行
- 方法体内的功能最好单一化
- 一个方法体内不能有太多的If…else…操作。一个方法体内不能超过三个if else 的条件判断超出部分应进行方法提炼。
例如:
应该避免
If(a)
{
If(c)
{
If(d)
{
If(e)
{
}
}
Else
{
}
}
}
- 避免手动的增加空格以及TAB键。
VS调整格式请用通用的CTRL+E+D;
- 避免在代码中写入常数字符串,应该有通用的常数定义类来专门定义。
例如:
应将
If(A.Equase(“strValue”))
{
_strValue=”strValue”;
}
改成:
private const string CONT_NAME_VALUE = “strValue”;
If(A.Equase(CONT_NAME_VALUE))
{
_strValue= CONT_NAME_VALUE
}
- 使用查询表达式代替循环var q = foos.Where(x => x > 100);
- 对象初始化Button btn = new Button { Text = "Click me!", BackColor = Color.FromArgb(255, 255, 255) };
- 尽可能只用系统定义的委托,而不是自己定义委托类型。系统定义的委托包括:各种泛型参数数目的Func, Action; 一个Predicate<T>;各种EventHandler。
- 在任何时候都应避免使用ref/out传递参数,尤其对引用类型(禁止引用的引用)。尝试改进你的设计。
- 当函数需要返回多个值时,应当使用元组而不是使用输出参数。.NET 4.0中提供了Tuple泛型类,位于System命名空间。
- 空字符串写成string.Empty