C#命名规则、开发习惯和风格 (转)
http://www.cnblogs.com/iloveWater/articles/2209769.html
1.在每个文件的头部必须包括以下注释:(更多文档注释内容查看>>)
/*----------------------------------------------------------------
// Copyright (C) 2010 南昌大学家园网版权所有。
//
// 文件名:
// 文件功能描述:
//
//
// 创建人:(姓名,联系方式,时间)
//
// 修改标识:
// 修改描述:
//
// 修改标识:
// 修改描述:
//----------------------------------------------------------------*/
2.一行只建议作一个声明,并按字母顺序排列。如
int level; //推荐 int size; //推荐 int x, y; //不推荐
3.字段的声明:
不要使用是 public 或 protected 的实例字段。如果避免将字段直接公开给开发人员,可以更轻松地对类进行版本控制,原因是在维护二进制兼容性时字段不能被更改为属性。考虑为字段提供 get 和set 属性访问器,而不是使它们成为公共的。 get 和 set 属性访问器中可执行代码的存在使得可以进行后续改进,如在使用属性或者得到属性更改通知时根据需要创建对象。下面的代码示例阐释带有get 和 set 属性访问器的私有实例字段的正确使用。 示例:
public class Control : Component { private int handle; public int Handle { get { return handle; } } }
4.命名概述
名称应该说明“什么”而不是“如何”。通过避免使用公开基础实现(它们会发生改变)的名称,可以保留简化复杂性的抽象层。例如,可以使用 GetNextStudent(),而不是 GetNextArrayElement()。
命名原则是:
选择正确名称时的困难可能表明需要进一步分析或定义项的目的。使名称足够长以便有一定的意义,并且足够短以避免冗长。唯一名称在编程上仅用于将各项区分开。表现力强的名称是为了帮助人们阅读;因此,提供人们可以理解的名称是有意义的。不过,请确保选择的名称符合适用语言的规则和标准。
以下几点是推荐的命名方法。
1、避免容易被主观解释的难懂的名称,如方面名 AnalyzeThis(),或者属性名 xxK8。这样的名称会导致多义性。
2、在类属性的名称中包含类名是多余的,如 Book.BookTitle。而是应该使用 Book.Title。
3、只要合适,在变量名的末尾或开头加计算限定符(Avg、Sum、Min、Max、Index)。
4、在变量名中使用互补对,如 min/max、begin/end 和 open/close。
5、布尔变量名应该包含 Is,这意味着 Yes/No 或 True/False 值,如 fileIsFound。
6、在命名状态变量时,避免使用诸如 Flag 的术语。状态变量不同于布尔变量的地方是它可以具有两个以上的可能值。不是使用 documentFlag,而是使用更具描述性的名称,如documentFormatType。 (此项只供参考)
7、即使对于可能仅出现在几个代码行中的生存期很短的变量,仍然使用有意义的名称。仅对于短循环索引使用单字母变量名,如 i 或 j。 可能的情况下,尽量不要使用原义数字或原义字符串,如
For i = 1 To 7。而是使用命名常数,如 For i = 1 To NUM_DAYS_IN_WEEK 以便于维护和理解。
常用数据类型命名规范表
标识符 |
大小写 |
示例 |
类 |
Pascal |
AppDomain |
枚举类型 |
Pascal |
ErrorLevel |
枚举值 |
Pascal |
FatalError |
事件 |
Pascal |
ValueChange |
异常类 |
Pascal |
WebException 注意 总是以 Exception 后缀结尾。 |
只读的静态字段 |
Pascal |
RedValue |
接口 |
Pascal |
IDisposable 注意 总是以 I 前缀开始。 |
方法 |
Pascal |
ToString |
命名空间 |
Pascal |
System.Drawing |
属性 |
Pascal |
BackColor |
公共实例字段 |
Pascal |
RedValue 注意 很少使用。属性优于使用公共实例字段。 |
受保护的实例字段 |
Camel |
redValue 注意 很少使用。属性优于使用受保护的实例字段。 |
私有的实例字段 |
Camel |
redValue |
参数 |
Camel |
typeName |
方法内的变量 |
Camel |
backColor |
上表具体说明:
类
1、使用 Pascal 大小写。
2、用名词或名词短语命名类。
3、使用全称避免缩写,除非缩写已是一种公认的约定,如URL、HTML
4 、不要使用类型前缀,如在类名称上对类使用 C 前缀。例如,使用类名称 FileStream,而不是CFileStream。
5 、不要使用下划线字符 (_)。
6 、有时候需要提供以字母 I 开始的类名称,虽然该类不是接口。只要 I 是作为类名称组成部分的整个单词的第一个字母,这便是适当的。例如,类名称 IdentityStore 是适当的。在适当的地方,使用复合单词命名派生的类。派生类名称的第二个部分应当是基类的名称。例如,ApplicationException 对于从名为 Exception 的类派生的类是适当的名称,原因ApplicationException 是一种Exception。请在应用该规则时进行合理的判断。例如,Button 对于从 Control 派生的类是适当的名称。尽管按钮是一种控件,但是将 Control 作为类名称的一部分将使名称不必要地加长。
public class FileStream {} public class Button {} public class String { }
接口
以下规则概述接口的命名指南:
1、用名词或名词短语,或者描述行为的形容词命名接口。例如,接口名称 IComponent 使用描述性
名词。接口名称 ICustomAttributeProvider 使用名词短语。名称 IPersistable 使用形容词。
2、使用 Pascal 大小写。
3、少用缩写。
4、给接口名称加上字母 I 前缀,以指示该类型为接口。在定义类/接口对(其中类是接口的标准
实现)时使用相似的名称。两个名称的区别应该只是接口名称上有字母 I 前缀。
5、不要使用下划线字符 (_)。
6、当类是接口的标准执行时,定义这一对类/接口组合就要使用相似的名称。两个名称的不同之处
只是接口名前有一个I前缀。
以下是正确命名的接口的示例。
public interface IServiceProvider public interface IFormatable
以下代码示例阐释如何定义 IComponent 接口及其标准实现 Component 类。
public interface IComponent { // Implementation code goes here. } public class Component : IComponent { // Implementation code goes here. }
枚举 (Enum)
枚举 (Enum) 值类型从 Enum 类继承。以下规则概述枚举的命名指南:
1 对于 Enum 类型和值名称使用 Pascal 大小写。
2 少用缩写。
3 不要在 Enum 类型名称上使用 Enum 后缀。
4 对大多数 Enum 类型使用单数名称,但是对作为位域的 Enum 类型使用复数名称。
5 总是将 FlagsAttribute 添加到位域 Enum 类型。
参数
以下规则概述参数的命名指南:
1、使用描述性参数名称。参数名称应当具有足够的描述性,以便参数的名称及其类型可用于在大多数情况下确定它的含义。
2、对参数名称使用 Camel 大小写。
3、 使用描述参数的含义的名称,而不要使用描述参数的类型的名称。开发工具将提供有关参数的类型的有意义的信息。因此, 通过描述意义,可以更好地使用参数的名称。少用基于类型的参数名称,仅在适合使用它们的地方使用它们。
4、不要使用保留的参数。保留的参数是专用参数,如果需要,可以在未来的版本中公开它们。相反,如果在类库的未来版本中需要更多的数据,请为方法添加新的重载。
5、不要给参数名称加匈牙利语类型表示法的前缀。
以下是正确命名的参数的示例。
Type GetType(string typeName); string Format(string format, args() As object);
方法
以下规则概述方法的命名指南:
1 使用动词或动词短语命名方法。
2 使用 Pascal 大小写。
3 以下是正确命名的方法的实例。
void RemoveAll(); void GetCharArray(); void Invoke();
属性 (property)
以下规则概述属性的命名指南:
1 使用名词或名词短语命名属性。
2 使用 Pascal 大小写。
3 不要使用匈牙利语表示法。
4 考虑用与属性的基础类型相同的名称创建属性。例如,如果声明名为 Color 的属性,则属
性的类型同样应该是 Color。请参阅本主题中后面的示例。
以下代码示例阐释正确的属性命名。
public class SampleClass { public Color BackColor { // Code for Get and Set accessors goes here. } }
以下代码示例阐释提供其名称与类型相同的属性。
public enum Color { // Insert code for Enum here. } public class Control { public Color Color { get { // Insert code here. } set { // Insert code here. } } }
以下代码示例不正确,原因是 Color 属性是 Integer 类型的。
public enum Color { // Insert code for Enum here. } public class Control { public int Color { // Insert code here } }
在不正确的示例中,不可能引用 Color 枚举的成员。Color.Xxx 将被解释为访问一个成员,
该成员首先获取 Color 属性( C# 中为 int 类型)的值,然后再访问该值的某个成员(该成
员必须是 System.Int32 的实例成员)。
常量 (const)
以下规则概述常量的命名指南:
所有单词大写,多个单词之间用 "_" 隔开。 如
public const string PAGE_TITLE = "Welcome";
数据类型简写表
数据类型 |
数据类型简写 |
标准命名举例 |
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 |
控件ID前缀缩写表
控件类型 |
缩写 |
示例 |
Button |
btn |
|
Check box |
chk |
chkReadOnly |
Combobox,drop-down list box |
cbo |
cboEnglish |
Communications |
com |
comFax |
ContextMenu |
ctxmnu |
|
Control(used within procedures when the specific type is unknown) |
ctr |
ctrCurrent |
Data grid |
dgd |
dgdTitles |
Data list |
dbl |
dblPublisher |
Data repeater |
drp |
drpLocation |
Form |
frm |
frmEntry |
Image |
img |
imgIcon |
Label |
lbl |
lblHelpMessage |
LinkLabel |
lnk |
|
List box |
lst |
lstPolicyCodes |
ListView |
lvw |
lvwHeadings |
Menu |
mnu |
mnuFileOpen |
ProgressBar |
prg |
prgLoadFile |
RadioButton |
rbtn |
|
RichTextBox |
rtf |
rtfReport |
Text box |
txt |
txtLastName |
Timer |
tmr |
tmrAlarm |
TreeView |
tre |
treOrganization |