C#编码规范
1.命名规则与风格(naming conventions and style)
1.1命名规则
1.1.1 变量命名规范
类型 |
前缀 |
示例 |
Array |
arr |
arrShoppingList |
Boolean |
bln |
blnIsPostBack |
Byte |
byt |
bytPixelValue |
Char |
chr |
chrDelimiter |
DateTime |
dtm |
dtmStartDate |
Decimal |
dec |
decAverageHeight |
Double |
dbl |
dblSizeofUniverse |
Integer |
int |
intRowCounter |
Long |
lng |
lngBillGatesIncome |
Object |
obj |
objReturnValue |
Short |
sht |
shtAverage |
Single |
sng |
sngMaximum |
String |
str |
strFirstName |
1.1.2 控件命名规范
类型 |
前缀 |
示例 |
AdRotator |
adrt |
adrtTopAd |
Button |
btn |
btnSubmit |
Calendar |
cal |
calMettingDates |
CheckBox |
chk |
chkBlue |
CheckBoxList |
chkl |
chklFavColors |
CompareValidator |
valc |
valcValidAge |
CustomValidator |
valx |
valxDBCheck |
DataGrid |
dgrd |
dgrdTitles |
DataList |
dlst |
dlstTitles |
DropDownList |
drop |
dropCountries |
HyperLink |
lnk |
lnkDetails |
Image |
img |
imgAuntBetty |
ImageButton |
ibtn |
ibtnSubmit |
Label |
lbl |
lblResults |
LinkButton |
lbtn |
lbtnSubmit |
ListBox |
lst |
lstCountries |
Panel |
pnl |
pnlForm2 |
PlaceHolder |
plh |
plhFormContents |
RadioButton |
rad |
radFemale |
RadioButtonList |
radl |
radlGender |
RangeValidator |
valg |
valgAge |
RegularExpression |
vale |
valeEmail_Validator |
Repeater |
rpt |
rptQueryResults |
RequiredFieldValidator |
valr |
valrFirstName |
Table |
tbl |
tblCountryCodes |
TableCell |
tblc |
tblcGermany |
TableRow |
tblr |
tblrCountry |
TextBox |
txt |
txtFirstName |
ValidationSummary |
vals |
valsFormErrors |
XML |
xmlc |
xmlcTransformResults |
1.1.3 ADO.NET控件命名规范
类型 |
前缀 |
示例 |
Connection |
conn |
connNorthwind |
Command |
cmd |
cmdReturnProducts |
Parameter |
parm |
parmProductID |
DataAdapter |
da |
daProducts |
DataReader |
dtr |
dtrProducts |
DataSet |
ds |
dsNorthWind |
DataTable |
dt |
dtProduct |
DataRow |
dr |
drRow98 |
DataColumn |
dc |
dcProductID |
DataRelation |
drel |
drelMasterDetail |
DataView |
dvw |
dvwFilteredProducts |
1.1.4 命名规则补充
Form
Class
Module
GroupBox
PictureBox
ComboBox
TreeView
ListView
TabControl
DateTimePicker
Timer
Splitter
ProgressBar
RichTextBox
ImageList
ToolBar
MenuItem
1.1.5 事件处理子程序
The name of an event-handling subroutine will consist of the ID of the control that rasied the event followed by the type of event being handled. For example, a subroutine named btnSubmit_Click handles the Click event of a Button control named btnSubmit.
When a control that raises an event is not assigned an ID, the type of the control is used instead of the ID. For example, the subroutine named Button_Click handles the Click event of a Button control without an ID.
1.2.编码风格
1 用pascal规则来命名方法和类型.
public class TextBox
{
}
2 用camel规则来命名局部变量和方法的参数.
string userName;
public AddUser(string userId, byte[] password);
3 所有的成员变量前加前缀 _
public class Database
{
}
4 接口的名称加前缀 I.
interface ICompare
{
}
5 自定义的属性以Attribute结尾
public class AuthorAttribute : Attribute
{
}
6 自定义的异常以Exception结尾
public class AppException : Exception
{
}
7 方法的命名.一般将其命名为动宾短语.
ShowDialog()
CreateFile()
GetPath()
8 代码的缩进.要用Tab,而不要用space, 保持严格的缩进:
l
l
9 局部变量的名称要有意义.不要用x,y,z等等(除用于For循环变量中可使用i,j,k,l,m,n).
string userName
10.建议局部变量在最接近使用它时再声明.
11 所有的成员变量声明在类的顶端,用一个换行把它和方法分开.
12.用有意义的名字命名namespace,如:产品名、公司名.
13.避免使用命名空间的完整限定名称,应使用using声明替代
14.避免using声明放置在命名空间内部
15.将所有的框架命名空间分组,将用户或第三方命名空间放置在其下
16.使用某个控件的值时,尽量命名局部变量.
17.文件名要能反应类的内容,最好是和类同名,一个文件中一个类或一组关连类.
18.大括号"{"要新起一行.
public class AuthorAttribute : Attribute
{
}
19.用C#预定义的类名,而不要用在System空间内别名.
20.一行不要超过80个字符.
21.尽量不要手工更改机器生成的代码,若必须更改,一定要改成和机器生成的代码风格一样.
22.关键的语句(包括声明关键的变量)必须要写注释.
23.将注释缩拍在与代码缩进同等级的位置上
24.所有的注释应该通过拼写检查.拼错的注释将预示冗余的开发
25.文字常量和数字常量不要硬编码,应该用常量类或枚举代替.
26.不准使用goto系列语句.
27.不要声明public和protected的成员变量,应用property.
28.不要声明public的event,而应使用事件访问器.
public class Source
{
}
29.类型转换的使用规则.
Animal animal = new Dog();
Dog dog = animal as Dog;
if (dog != null)
{
}
30.生成和构建一个长的字符串时,一定要使用StringBuilder,而不用string.
31.始终使用"{
32.switch语句一定要有default来处理意外情况.
33.尽量少使用三目运算符 ? : ,而要使用if语句.
34.尽量不用使用this引用,除非是要调用类中的另一个Constructor.
public class Person
{
}
35.
l
l
l
36.
37. 使用委托引用代替显式的委托实例(好像只有C#2.0才能这样用)
}
38. 当使用partial类并将其分配给每个文件一部分时,对每个文件命名使用后缀P并附带一个额外的数字
39.
40.
2.编码惯例(coding practices)
1. 避免在一个文件中放多个类。
2. 一个文件应该只对一个命名空间提供类型。避免在同一文件中有多个命名空间。
3. 避免文件长度超过500行(除了机器自动产生的代码)。
4. 避免方法定义超过25行。
5. 避免超过5个参数的方法。使用结构传递多个参数。
6. 每行应该不超过80个字符。
7. 不要手工编辑任何机器生成的代码。
9. 仅对操作的前提、内在算法等写文档。
10. 避免方法级的文档。
b) 方法级注释仅作为对其他开发人员的提示。
11. 决不要硬编码数值, 而总是声明一个常量。
12. 仅对本来就是常量的值使用const修饰符,例如一周的天数。
13.
避免对只读变量使用const修饰符。在此情况下,采用readonly修饰符。
14.
}
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
63.
64.
65.
66.
3.框架特别指导(framework specific guidelines)
- 总是以4级警告建立项目(图略)。
2. 在发布版中将警告作为错误(注意这不是VS.NET的缺省设置)(图略)。.
a) 虽然是可选的,本标准也推荐在调试版中将警告作为错误。
3.
4. 总是在应用程序的配置文件中显式地说明支持的运行时版本。
5. 避免显式地自定义版本改向和绑定到CLR程序集。
6.
避免显式的预编译定义(#define)。使用项目设置定义条件编译常量。
7. 不要在AssemblyInfo.cs中放任何逻辑。
8. 除了在AssemblyInfo.cs,不要在任何文件中放程序集属性。
9.
在AssemblyInfo.cs中提供所有字段,例如公司名称、描述、版权等。
10. 所有程序集应该使用相对路径引用。
11. 不允许在程序集中循环引用。
12. 避免多模块的程序集。
13.
缺省总是以非检查的方式运行(为了性能考虑),但是对易于溢出或下溢的操作显式使用检查模式。
int CalcPower(int number,int power)
{
}
14.
避免使用Exception窗口(Debug|Exceptions)篡改异常处理。
15.
努力对同一逻辑应用程序中(通常是一个解决方案)的所有程序集和客户端使用统一的版本号。
16. Visual
Studio.NET应用的配置文件命名为App.config,并将其包括在项目中。
17. 避免使用显式代码来排除方法(#if#endif),而是使用条件方法。
public class MyClass
{
}
18.
将VS.NET缺省的项目结构改为标准的布局,对项目文件夹和文件应用统一的结构。
19. 链接一个包含所有解决方案级信息的全局共享文件(图略)。
20. 制表符选用"插入空格",使用3个空格代替制表符。
21. 发布版中应该包含调试符号。
22. 总是对程序集签名,包括客户端应用程序。
23. 总是使用项目的SNK文件对互操作程序集签名(图略)。
4.项目设置和项目结构(Project Settings and Project Structure)
1. 总是使用类型安全的数据集或者数据表。避免使用原始的ADO.NET。
2. 访问数据库时总是使用事务。
3. 总是将事务隔离级别设置为序列的。
a) 使用其它隔离级别需要管理层决定。
4.
不要使用服务器浏览器将数据库连接拖到Windows表单、ASP.NET表单或Web服务中。这样做耦合了界面层和数据层。
5. 避免使用SQL Server验证。
6. 将访问SQL Server的组件以调用该组件客户端不同的身份运行。
7. 总是在高层用类型安全的类包装存储过程。仅在那个类中调用存储过程。
8. 避免在存储过程中放任何逻辑。