一、命名约定
1.常用命名术语说明
Pascal命名格式 将标识符的首字母和后面连接的每个单词的首字母都大写。可以对三字符或更多字符的标识符使用 Pascal 大小写。例如:BackColor
Camel命名格式 标识符的首字母小写,而每个后面连接的单词的首字母都大写。例如:backColor
2.名称空间命名
创建命名空间的名称时应使用以下原则:
“公司名称.技术名称.软件产品代号”或“公司名称.产品技术代号”
例如:Nd.ClassLibrary.Charting 命名空间就表示Nd公司里的公用类库里的Charting画图类库。
又如:Net91com.Movies.DataAccess 名称空间标识 91.COM 电影站的数据访问层程序集。
3.类命名
使用完整的单词,避免用缩写。比如ButtonGrid比BtnGrd要长,但是完整从而可读性好。
一般使用名词。类通常表示一种对象,而对象一般使用具有名词性质的名称。
异常类命名:类以Exception结尾,
比如class EQException: Exception{}
4.局部变量命名
私有字段、函数参数和函数内部声明的变量使用camel Casing
不使用的是用以指明字段作用域的前缀。如 s_作为共享字段或静态字段的前缀,以及把g_作为全局变量的前缀。
不使用用以指明数据类型的匈牙利前缀表示法,如(strReturn)。在Microsoft Visual Studio .NET环境中,只要在代码编辑器中将鼠标移到域名上,就可以得到关于字段或变量的类型信息。另外,类型前缀限制了开发者在需要时改变变量的类型的能力,或者更糟糕的是,开发者改变了变量的类型,却没有为变量重新命名,从而产生具有误导性的代码。
5.只读静态变量
Pascal大小写
6.类私有变量
_ +Pascal大小写。如:_BackColor
7.属性命名
使用PascalCasing。
属性名称通常都是名词。例如Text、SelectedIndex和Width。
8.接口命名
使用Pascal Casing。
在接口名称前缀添加前缀 I 。
接口名称尽量具有描述性,并使用形容词,因为接口常常用于给一个类添加某种能力。基于形容词的名称有IComparable和IFormattable等
9.方法命名
使用Pascal Casing。
方法名通常是动词。方法实现一个对象的行为功能。方法执行某些操作。方法名的例子有Read、Write、Start和Stop。
当重载方法时,参数的顺序和命名要一致。
定义方法名时不要使用缩写。
方法参数 Camel大小写结构
10.事件命名
使用Pascal Casing。
事件名称通常是动词。比如Click、Load和Paint
11.枚举类型
使用PascalCasing。如:EQFormatConditionOperator。枚举值也是Pascal,比如EQFormatConditionOperator. Equal
12.委托命名delegate
AfterOperationHandler,总是以Handler为后缀结尾
13.类对象命名
使用obj前缀+Pascal命名的方式,来告知我们这个变量是一个对象
比如:EQApplication objApp = newEQApplication();
14.Attribute
Pascal大小写,并以Attribute结尾
15.控件命名
[attachimg]79[/attachimg]
[attachimg]80[/attachimg]
16.其它命名
[attachimg]81[/attachimg]
17.注意:
不要使用两个字母一样,但大小写不一样的命名来做命名空间,否则在一些不区分大小写的语言里将不能正确区分这些命名空间声明。例如:namespace ee.cummings和namespace EE.cummings这两个声明
不要使用大小写区分参数的形式来创建方法。比如:voidMyFunction(string a, string A)
不要使用大小写的不同来分别命名一个属性。比如:
int Color { get,set }
int COLOR { get,set }
不要使用大小写的不同来分别命名一个方法的名字。比如:
void calculate()
void Calculate()
不要使用标志名称的一部分作为该标志名称的缩写或简写。比如:GetWindow简写为GetWin。
尽量避免用缩写方式来对方法的参数命名,即方法的参数命名尽量保持完整,让人一目了然。
尽量避免就一个字母的命名,如 i 或 t,而用 index 或 temp
二、代码格式化
1.{}的位置
{与}各单独占一行。例如:
if(x > 5)
{
//代码
}
2.if、if else的格式
if(condition)
{
DoSomething();
}
if(condition)
{
DoSomething();
}
else
{
DoSomethingOther();
}
if(condition)
{
DoSomething();
}
else if(condition)
{
DoSomethingOther();
}
else
{
DoSomethingOtherAgain();
}
3.for、foreach的格式
//for格式
for(int i = 0; i < 5; ++i)
{
// 代码
}
//foreach的格式
foreach(int i in IntList)
{
// 代码
}
4.while/switch的格式
//while格式
while(condition)
{
// 代码
}
//switch的格式
switch(condition)
{
case A: ...
break;
case B:
...
break;
default:
...
break;
}
5.try的格式
try
{...
}
catch(Exception e)
{...
}
//或者
try
{...
}
catch(Exception e)
{...
}
finally
{ ...
}
6.空格
对于有两个或两个以上空格时,一般不要使用空格来表示缩进,使用Tab
逗号、分号之后有一个空格
如:TestMethod(a, b, c);
操作符前后有一个空格,但是单目运算符除外(例如: !运算符)。
如:for(int i = 0; i <10; ++i)
7.在执行统一任务的各个语句组之间插入一个空行。
8.名称空间写法,各类名称空间插入空行,同一类命命空间按字母序号排列
如:
using System;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using net91com.Movies.DataAccess;
using net91com.Movies.Business;
using net91com.CommonComponent;
三、代码注释
1.注释的目的
a.文字说明代码的作用 (即为什么要用编写该代码,而不是如何编写);
b.确指出该代码的编写思路和逻辑方法 ;
c.人们注意到代码中的重要转折点;
d.使代码的阅读者不必在他们的头脑中仿真运行代码的执行方法
2.对类文件进行属性注释说明
//===============================================================================
//公司:
//项目名称:
//模块名称:
//开发人员:
//开发日期:
//功能简介:
//最后修改时间:
//修改人员:
//===============================================================================
3.避免对很显然易懂的语句进行注释说明
4.代码应该能作到自我解释代码作用的功能。
5.注释来说明何时可能出错和为什么出错
6.在编写代码前进行注释,给类、属性或方法前面加上功能注释
7.注释的内容
a.实参/ 参数
参数类型 , 参数用来做什么, 任何约束或前提条件
b.字段/属性
字段描述 , 注释所有使用的不变量, 并行事件可见性决策
c.类
类的目的 ,已知的问题 , 类的开发/维护历史 ,注释出采用的不变量 , 并行策略
d.接口
目的 它应如何被使用以及如何不被使用
e.局部变量
用处/目的
f.成员函数注释
成员函数做什么以及它为什么做这个
哪些参数必须传递给一个成员函数
成员函数返回什么
已知的问题
任何由某个成员函数抛出的异常
可见性决策
成员函数是如何改变对象的
包含任何修改代码的历史
如何在适当情况下调用成员函数的例子适用的前提条件和后置条件
g.成员函数内部注释
控制结构
代码做了些什么以及为什么这样做
局部变量
难或复杂的代码
处理顺序
8.增强注释的可读性
a.使用完整的语句。
b.避免使用缩写。
c.将整个单词大写,以突出它们的重要性。
9.请在每个if语句/switch语句/循环语句的前面加上注释
四、类/接口成员设计
1.设计类和方法时的原则
创建更加容易调试和维护的方法
创建具有强大内聚力的类
创建高度专用的方法
创建松散连接的方法
尽量使方法具有独立性
提高方法的扇入性
降低方法的扇出性
2.名称空间引用
using 声明一律以.NET基础框架命名空间、第三方组件命名空间、最后是公司内部产品命名空间排序。
using System;
using System.Collections;
using Microsoft.CSharp;
using Sirc.Egss.FileExchangeServer;
3.成员排列规则
尽量不要使用类public变量,用属性代替
类成员以internal、private、protected、public排列。public部分按照构造函数、属性、方法、事件的顺序排列。
4.每个类文件名应尽量保持与内部类名一致
5.尽量避免手动去修改工具环境自动生成的代码
6.避免在一个类文件里放置多个类
7.一个类文件里应该有且仅有一个命名空间,避免在一个类文件里包含多个不同的命名空间
8.避免在一个类文件里代码超过 500 行(除去自动生成的代码)
9.数据结构里,应该总是更倾向使用C#的范型generic
10.尽量缩小变量的作用域
11.接口设计
将接口名去掉 I 前缀后,作为这种默认实现类的名称。比如IComponent的默认实现类是Component
每个接口不应当有超过20个成员的情况,一般应保持在12个左右
12.方法设计
创建松散连接和高度专用的方法
创建方法时,设法将每个方法视为一个黑箱,其他例程不应要求了解该方法的内部工作情况,该方法也不应要求了解它外面的工程情况。这就是为什么你的方法应依靠参数而不应依靠全局变量的原因。
a.将复杂进程放入专用方法。
b.将专用方法中可能要修改的代码隔离。
c.将数据输入/输出(I/O)放入专用方法。
d.将业务规则封装在专用方法中。
e.有返回值的方法必须在方法命名里包含对该返回值的信息描述,如GetObjectStat()。
f.局部变量的声明,应尽可能紧靠在它首次被使用的地方
g.一个方法里的代码避免超过 25 行,最多不能超过 50 行(除去空行、注释)
h.一行代码最多不要超过 80 个字符
i.避免使用强制转换,推荐使用as操作符进行防御性转换
j.当需要创建一个长字符串时,推荐使用StringBuilder,而非string
k.避免使用不易理解的数字,用有意义的标识来替代(枚举和常量)
13.属性设计
避免使用返回数组的属性。这些属性会降低程序的效率
不要提供public或protected型的成员变量,而应当使用属性替代之
五、数据库设计规范
数据库名
Pascal Casing命名规则
以名词命名,直观,可读性强
表名
Pascal Casing命名规则
应以完整单词命名,避免使用缩写。
数据字典以“dic_表名”来命名
字段命名
Pascal Casing命名规则
以"表名_字段名"进行命名
存储过程命名
全部大写
以"UP_表名_操作"进行命名
视图命名
全部大写
以"VIEW_功能"进行命名
触发器命名
全部大写
以"TR_功能"进行命名
主键命名
全部大写
以"PK_表名_列名"进行命名
外键命名
全部大写
以"FK_从表名_表名_主表名"进行命名
Check约束命名
全部大写
以"CK_表名_列名"进行命名
索引命名
全部大写
以"IDX_表名_列名"进行命名