编程规范的目的是帮助程序员写出简洁规范易读的程序,但也没必要过分被其所约束!
一.命名规范
一般规范:
命名应具有描述性、表意性,应该能够告诉读程序的人命名对象存储了什么内容或者提供了什么功能,以提高代码可读性;
命名应避免使用缩写,使用缩写的地方应给出说明;
命名应避免使用系统保留字、关键字;
命名应避免使用下划线等特殊字符;
控件命名采用 控件简写+控件意义 的命名方式;
常见命名法:
1. 匈牙利命名法
该方法最先由一位名叫 “Charles Simonyi” 的微软程序员提出。
匈牙利命名法的主要规范为,通过在变量名之前增加小写字母的符号前缀,以标识变量的属性、类型、作用域等参数,以使程序员操作变量时对变量的类型和其它属性有直观的了解。简单地说,即“变量名=属性+类型+对象描述”的形式。
示例:m_lpszStr,表示指向以 0 字符结尾的字符串的长指针成员变量。
该命名法较为繁琐,且借助于强大的IDE前缀已失去意义,所以C#中不推荐使用该命名法。
2. Camel命名法
骆驼命名法,也叫驼峰命名法、驼峰式大小写。其主要规范为,首字母小写,逻辑断点首字母大写。
示例:printEmployeePaychecks(),如代码所示,函数的每一个逻辑断点均用大写字母标识。
与此类似,普通的下划线法为:print_employee_paychecks(),逻辑断点使用下划线 “-” 而非字母大写化。
骆驼式命名法是较为流行的书写方式,具有简洁,阅读性强的特点。
3. Pascal命名法
与骆驼命名法类似,骆驼命名法是首字母小写,而帕斯卡命名法则需要首字母大写。源自 Pascal 语言的命名惯例,也称为大驼峰式命名法。
示例:LoginCheck(),string UserName
1.WinForm Control 命名规范
控件类型 | 控件型简写 | 标准命名举例 |
Label | lbl | lblMessage |
LinkLabel | llbl | llblToday |
Button | btn | btnSave |
TextBox | txt | txtName |
MainMenu | mmnu | mmnuFile |
CheckBox | chk | chkStock |
RadioButton | rbtn | rbtnSelected |
GroupBox | gbx | gbxMain |
PictureBox | pic | picImage |
Panel | pnl | pnlBody |
DataGrid | dgrd | dgrdView |
ListBox | lst | lstProducts |
CheckedListBox | clst | clstChecked |
ComboBox | cbo | cboMenu |
ListView | lvw | lvwBrowser |
TreeView | tvw | tvwType |
TabControl | tctl | tctlSelected |
DateTimePicker | dtp | dtpStartDate |
HscrollBar | hsb | hsbImage |
VscrollBar | vsb | vsbImage |
Timer | tmr | tmrCount |
ImageList | ilst | ilstImage |
ToolBar | tlb | tlbManage |
StatusBar | stb | stbFootPrint |
OpenFileDialog | odlg | odlgFile |
SaveFileDialog | sdlg | sdlgSave |
FoldBrowserDialog | fbdlg | fgdlgBrowser |
FontDialog | fdlg | fdlgFoot |
ColorDialog | cdlg | cdlgColor |
PrintDialog | pdlg | pdlgPrint |
2. WebForm Control 命名规范
控件类型 | 控件简写 | 标准命名举例 |
AdRotator | adrt | Example |
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 |
3. ADO.NET 命名规范
数据类型 | 数据类型简写 | 标准命名举例 |
Connection | con | conNorthwind |
Command | cmd | cmdReturnProducts |
Parameter | parm | parmProductID |
DataAdapter | adp | adpProducts |
DataReader | reader | readerProducts |
DataSet | ds | dsNorthWind |
DataTable | dt | dtProduct |
DataRow | dr | drRow98 |
DataColumn | dc | dcProductID |
DataRelation | drel | drelMasterDetail |
DataView | dv | dvwFilteredProducts |
数据类型 | 数据类型简写 | 标准命名举例 |
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 | shr | shrAverage |
Single | sng | sngMaximum |
String | str | strFirstName |
4. C# 命名规范
命名对象 | 命名法 | 说明 |
命名空间 | Pascal | 一般规则:CompanyName.TechnologyName,用点号分隔逻辑成分 |
类 | Pascal | 使用名词或名词短语命名,避免使用前缀、带下划线字符 |
成员变量 | Camel | |
属性 | Pascal | 名称与对应的成员变量保持一致 |
方法 | Pascal | 采用动宾结构,描述出方法的作用 |
方法参数 | Camel | |
局部变量 | Camel | |
接口 | Pascal | 使用名词、名词短语或者描述行为的形容词,使用前缀I |
事件 | Pascal | 使用后缀EventHandler,要有之前和之后的时态概念,ing和ed |
C# Coding Standard
一、命名
1.用pascal规则来命名方法和类型.
public class TextBox
{
public void DataBind()
{
}
}
2.用camel规则来命名局部变量和方法的参数.
string userName;
public AddUser(string userId, byte[] password);
3.所有的成员变量前加前缀 m_
public class Database
{
public string m_connectionString;
}
4.接口的名称加前缀 I.
interface ICompare
{
int compare();
}
5.自定义的属性以Attribute结尾
public class AuthorAttribute : Attribute
{
}
6.自定义的异常以Exception结尾
public class AppException : Exception
{
}
7.方法的命名.一般将其命名为动宾短语.
ShowDialog()
CreateFile()
GetPath()
8.代码的缩进.要用Tab,而不要用space.
9.局部变量的名称要有意义.不要用x,y,z等等.
string userName
10.所有的成员变量声明在类的顶端,用一个换行把它和方法分开.
11.用有意义的名字命名namespace,如:产品名、公司名.
12.建议局部变量在最接近使用它时再声明.
13.使用某个控件的值时,尽量命名局部变量.
14.把引用的系统的namespace和自定义或第三方的分开.
15.文件名要能反应类的内容,最好是和类同名,一个文件中一个类.
16.目录结构中要反应出namespace的层次.
17.大括号"{"要新起一行.
public class AuthorAttribute : Attribute
{
}
二、编码习惯.
1.用C#预定义的类名,而不要用别名.
string userName; 而不是 System.String userName;
int number; 而不是 System.Int32;
2.一行不要超过80个字符.
3.尽量不要手工更改机器生成的代码,若必须更改,一定要改成和机器生成的代码风格一样.
4.关键的语句(包括声明关键的变量)必须要写注释.
5.文字常量和数字常量不要硬编码,应该用常量类或枚举代替.
6.不要用goto系列语句.
7.不要声明public和protected的成员变量,应用property.
8.不要声明public的event,应用事件访问器.
public class Source
{
private EventHandler m_NumberChangeEvent;
public event EventHandler NumberChangeEvent
{
add
{
m_NumberChangeEvent += value;
}
remove
{
m_NumberChangeEvent -= value;
}
}
}
9.类型转换的使用规则.
Animal animal = new Dog();
Dog dog = animal as Dog;
if (dog != null)
{
}
10.生成和构建一个长的字符串时,一定要使用StringBuilder,而不用string.
11.始终使用"{ }"包含if下的语句,即使只有一条语句.
12.switch语句一定要有default来处理意外情况.
13.尽量不要使用三目运算符 ? : ,而要使用if语句.
14.尽量不用使用this引用,除非是要调用类中的另一个Constructor.
public class Person
{
public Person(string name)
{
}
public Person() : this("Jim")
{
}
}
数据库:
表名:首字母大写+驼峰式命名 eg:Article;UserDept
表中列名:首字母大写+驼峰式命名 eg:UserId;UnitCost
存储过程命名:表名_首字母大写+驼峰式命名 eg:Admin_UserRegister
项目名称:
公认简写:全部大写 eg:DAL;BLL
其他:首字母大写+驼峰式命名 eg:DBUtility;OracleDAL
类:
类名:首字母大写+驼峰式命名 eg:PetShop.cs;AssemblyInfo.cs
私有变量名:_首字母小写+驼峰式命名 eg:_publishTime;_rootCategoryId
公共属性名:首字母大写+驼峰式命名 eg:Description;PublishTime
函数:
函数名:首字母大写+驼峰式命名 eg:GetItemByProduct
参数名:首字母小写+驼峰式命名 eg:userId,itemInfo
自定义的特性和异常分别使用后缀Attribute、Exception
二.代码书写格式规范
使用Tab进行代码缩进(空四格);
把相似的内容放在一起,比如数据成员、属性、方法、事件等,并适当的使用#region…#endregion;
成员变量声明放在类的顶端;
始终使用"{ }"包含if下的语句,即使只有一条语句;
使用括号清晰地表达算术表达式和逻辑表达式的运算顺序。如将 x=a*b/c*d 写成 x=(a*b/c)*d可避免阅读者误解为x=(a*b)/(c*d);
文件之中不得存在无规则的空行,比如说连续十个空行,方法与方法之间空一行;
在方法内部,逻辑上相对独立的两个语句块要适当空行;
避免过多的循环嵌套和条件嵌套;
尽量提取公共过程、重复操作,进行代码重用;
其它参考:http://blog.youkuaiyun.com/sunningliu/archive/2009/01/04/3704164.aspx
代码注释规范
.cs文件的注释
所有.cs文件开头都要加上注释,写明文件创建时间、作者、用途概述等
例如:
//********************************************************
//日期:2004.7.19
//作者:XXX
//说明:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//********************************************************
函数过程注释
复杂的函数体开头都要加上注释,使用.NET注释规范。
例如:
/// <summary>
/// 构造函数
/// </summary>
/// <param name='is_xxx1'>示例参数1</param>
/// <param name='is_xxx2'>示例参数2</param>
public UpgradeThread(string is_xxx1, string is_xxx2)
{
//…
}
常量变量注释
所有的常量变量,无论是全局还是局部使用的,凡是对代码整体起到关键性做用的都需要加上注释。
例如:
/// <summary>
/// 当前线程指向的备份文件本地保存路径
/// </summary>
public string StorePath = '';
代码修改注释
当开发者维护以前的程序代码时,需要在修改处的开始及结尾,加上自己的注释信息。
例如:
//BEGIN 2004-7-19 Jayson 修正了XXX问题
略…
//END 2004-7-19 Jayson
MyData 就是一个帕斯卡命名的示例
myData是一个骆驼命名法,它第一个单词的第一个字母小写,后面的单词首字母大写,看起来像一个骆驼
iMyData是一个匈牙利命名法,它的小写的i说明了它的型态,后面的和帕斯卡命名相同,指示了该变量的用途.
变量命名规范:
内联变量 必须一骆驼camel命名法声明:
for example: uName,uPass;
类变量(成员变量) 同上,但一定要以一个下划线开始!
for example: _mySqlConn
常量命名规范:
带有私有访问修饰的常量必须以骆驼命名法声明,并以一个下划线开始,
for example: private int _SHOW_COUNT=20;
带有公有修饰符.受保护修饰符的常量必须以帕斯卡命名法声明,
for example: protected int COUNT=20;
数组必须以骆驼命名法声明 for example: string[5] nameArray;
string[] nameArray=new string[5];
int[] userAge={20,30,21,22,25,24,22};
结构命名规范:
结构必须以帕斯卡命名法声明,用词或者短语作为声明的首选!
for example: public struct StructName{
//结构体!
}
枚举命名规范:
枚举必须以帕斯卡命名规范命名:
for example: public enum WeekDays{
//结构体
}