C#命名编码规范
一、 前言
一致的命名模式是托管类库中可预知性与可发现性最重要的元素之一。对这些命名指南广泛的使用和理解将消除许多最常见的用户问题。本主题提供 .NET Framework 类型的命名指南。对于每个类型,还应该注意关于大写样式、区分大小写和措词的一些通用规则。
二、 命名指南
二.1 大写样式
使用下面的三种大写标识符约定。
二.1.1 Pascal 大小写
将标识符的首字母和后面连接的每个单词的首字母都大写。可以对三字符或更多字符的标识符使用 Pascal 大小写。例如:
BackColor
二.1.2 Camel 大小写
标识符的首字母小写,而每个后面连接的单词的首字母都大写。例如:
backColor
二.1.3 大写
标识符中的所有字母都大写。仅对于由两个或者更少字母组成的标识符使用该约定。例如:
System.IO
System.Web.UI
可能还必须大写标识符以维持与现有非托管符号方案的兼容性,在该方案中所有大写字母经常用于枚举和常数值。一般情况下,在使用它们的程序集之外这些字符应当是不可见的。
下表汇总了大写规则,并提供了不同类型的标识符的示例。
|
标识符 |
大小写 |
示例 |
|
类 |
Pascal |
AppDomain |
|
枚举类型 |
Pascal |
ErrorLevel |
|
枚举值 |
Pascal |
FatalError |
|
事件 |
Pascal |
ValueChange |
|
异常类 |
Pascal |
WebException 注意 总是以 Exception 后缀结尾。 |
|
只读的静态字段 |
Pascal |
RedValue |
|
接口 |
Pascal |
IDisposable 注意 总是以 I 前缀开始。 |
|
方法 |
Pascal |
ToString |
|
命名空间 |
Pascal |
System.Drawing |
|
参数 |
Camel |
typeName |
|
属性 |
Pascal |
BackColor |
|
受保护的实例字段 |
Camel |
redValue 注意 很少使用。属性优于使用受保护的实例字段。 |
|
公共实例字段 |
Pascal |
RedValue 注意 很少使用。属性优于使用公共实例字段。 |
二.2 区分大小写
为了避免混淆和保证跨语言交互操作,请遵循有关区分大小写的使用的下列规则:
l 不要使用要求区分大小写的名称。对于区分大小写和不区分大小写的语言,组件都必须完全可以使用。不区分大小写的语言无法区分同一上下文中仅大小写不同的两个名称。因此,在创建的组件或类中必须避免这种情况。
l 不要创建仅是名称大小写有区别的两个命名空间。例如,不区分大小写的语言无法区分以下两个命名空间声明。
namespace ee.cummings;
namespace Ee.Cummings;
l 不要创建具有仅是大小写有区别的参数名称的函数。下面的示例是不正确的。
void MyFunction(string a, string A)
l 不要创建具有仅是大小写有区别的类型名称的命名空间。在下面的示例中,Point p 和 POINT p 是不适当的类型名称,原因是它们仅在大小写方面有区别。
System.Windows.Forms.Point p
System.Windows.Forms.POINT p
l 不要创建具有仅是大小写有区别的属性名称的类型。在下面的示例中,int Color 和 int COLOR 是不适当的属性名称,原因是它们仅在大小写方面有区别。
int Color {get, set}
int COLOR {get, set}
l 不要创建具有仅是大小写有区别的方法名称的类型。在下面的示例中,calculate 和 Calculate 是不适当的方法名称,原因是它们仅在大小写方面有区别。
void calculate()
void Calculate()
二.3 缩写
为了避免混淆和保证跨语言交互操作,请遵循有关区缩写的使用的下列规则:
l 不要将缩写或缩略形式用作标识符名称的组成部分。例如,使用 GetWindow,而不要使用 GetWin。
l 不要使用计算机领域中未被普遍接受的缩写。
l 在适当的时候,使用众所周知的缩写替换冗长的词组名称。例如,用 UI 作为 User Interface 的缩写,用 OLAP 作为 On-line Analytical Processing 的缩写。
l 在使用缩写时,对于超过两个字符长度的缩写,请使用 Pascal 大小写或 Camel 大小写。例如,使用 HtmlButton 或 htmlButton。但是,应当大写仅有两个字符的缩写,如,System.IO,而不是 System.Io。
l 不要在标识符或参数名称中使用缩写。如果必须使用缩写,对于由多于两个字符所组成的缩写请使用 Camel 大小写,虽然这和单词的标准缩写相冲突。
二.4 措词
避免使用与常用的 .NET Framework 命名空间重复的类名称。例如,不要将以下任何名称用作类名称:System、Collections、Forms 或 UI。有关 .NET Framework 命名空间的列表,请参见类库。
另外,避免使用和以下关键字冲突的标识符。
|
AddHandler |
AddressOf |
Alias |
And |
Ansi |
|
As |
Assembly |
Auto |
Base |
Boolean |
|
ByRef |
Byte |
ByVal |
Call |
Case |
|
Catch |
CBool |
CByte |
CChar |
CDate |
|
CDec |
CDbl |
Char |
CInt |
Class |
|
CLng |
CObj |
Const |
CShort |
CSng |
|
CStr |
CType |
Date |
Decimal |
Declare |
|
Default |
Delegate |
Dim |
Do |
Double |
|
Each |
Else |
ElseIf |
End |
Enum |
|
Erase |
Error |
Event |
Exit |
ExternalSource |
|
False |
Finalize |
Finally |
Float |
For |
|
Friend |
Function |
Get |
GetType |
Goto |
|
Handles |
If |
Implements |
Imports |
In |
|
Inherits |
Integer |
Interface |
Is |
Let |
|
Lib |
Like |
Long |
Loop |
Me |
|
Mod |
Module |
MustInherit |
MustOverride |
MyBase |
|
MyClass |
Namespace |
New |
Next |
Not |
|
Nothing |
NotInheritable |
NotOverridable |
Object |
On |
|
Option |
Optional |
Or |
Overloads |
Overridable |
|
Overrides |
ParamArray |
Preserve |
Private |
Property |
|
Protected |
Public |
RaiseEvent |
ReadOnly |
ReDim |
|
Region |
REM |
RemoveHandler |
Resume |
Return |
|
Select |
Set |
Shadows |
Shared |
Short |
|
Single |
Static |
Step |
Stop |
String |
|
Structure |
Sub |
SyncLock |
Then |
Throw |
|
To |
True |
Try |
TypeOf |
Unicode |
|
Until |
volatile |
When |
While |
With |
|
WithEvents |
WriteOnly |
Xor |
eval |
extends |
|
instanceof |
package |
var |
|
二.5 避免类型名称混淆
不同的编程语言使用不同的术语标识基本托管类型。类库设计人员必须避免使用语言特定的术语。请遵循本节中描述的规则以避免类型名称混淆。
使用描述类型的含义的名称,而不是描述类型的名称。如果参数除了其类型之外没有任何语义含义,那么在这种罕见的情况下请使用一般性名称。例如,支持将各种数据类型写入到流中的类可以有以下方法。
void Write(double value);
void Write(float value);
void Write(long value);
void Write(int value);
void Write(short value);
不要创建语言特定的方法名称,如下面的示例所示。
void Write(double doubleValue);
void Write(float floatValue);
void Write(long longValue);
void Write(int intValue);
void Write(short shortValue);
二.6 命名空间命名指南
命名命名空间时的一般性规则是使用公司名称,后跟技术名称和可选的功能与设计,如下所示。
CompanyName.TechnologyName[.Feature][.Design]
例如:
Microsoft.Media
Microsoft.Media.Design
给命名空间名称加上公司名称或者其他知名商标的前缀可以避免两个已经发布的命名空间名称相同的可能性。例如,Microsoft.Office 是由 Microsoft 提供的 Office Automation Classes 的一个适当的前缀。
在第二级分层名称上使用稳定的、公认的技术名称。将组织层次架构用作命名空间层次架构的基础。命名一个命名空间,该命名空间包含为具有 .Design 后缀的基命名空间提供设计时功能的类型。例如,System.Windows.Forms.Design 命名空间包含用于设计基于 System.Windows.Forms 的应用程序的设计器和相关的类。
嵌套的命名空间应当在包含它的命名空间中的类型上有依赖项。例如,System.Web.UI.Design 中的类依赖于 System.Web.UI 中的类。但是,System.Web.UI 中的类不依赖于 System.Web.UI.Design 中的类。
应当对命名空间使用 Pascal 大小写,并用句点分隔逻辑组件,如 Microsoft.Office.PowerPoint 中所示。如果您的商标使用非传统的大小写,请遵循您的商标所定义的大小写,即使它与规定的 Pascal 大小写相背离。例如,命名空间 NeXT.WebObjects 和 ee.cummings 阐释了对于 Pascal 大小写规则的适当背离。
如果在语义上适当,使用复数命名空间名称。例如,使用 System.Collections 而不是 System.Collection。此规则的例外是商标名称和缩写。例如,使用 System.IO 而不是 System.IOs。
不要为命名空间和类使用相同的名称。例如,不要既提供 Debug 命名空间也提供 Debug 类。
最后,请注意命名空间名称不必非得与程序集名称相似。例如,如果命名程序集 MyCompany.MyTechnology.dll,它没有必要非得包含 MyCompany.MyTechnology 命名空间。
二.7 类命名指南
以下规则概述命名类的指南:
l 使用名词或名词短语命名类。
l 使用 Pascal 大小写。
l 少用缩写。
l 不要使用类型前缀,如在类名称上对类使用 C 前缀。例如,使用类名称 FileStream,而不是 CFileStream。
l 不要使用下划线字符 (_)。
l 有时候需要提供以字母 I 开始的类名称,虽然该类不是接口。只要 I 是作为类名称组成部分的整个单词的第一个字母,这便是适当的。例如,类名称 IdentityStore 就是适当的。
l 在适当的地方,使用复合单词命名派生的类。派生类名称的第二个部分应当是基类的名称。例如,ApplicationException 对于从名为 Exception 的类派生的类是适当的名称,原因是 ApplicationException 是一种 Exception。请在应用该规则时进行合理的判断。例如,Button 对于从 Control 派生的类是适当的名称。尽管按钮是一种控件,但是将 Control 作为类名称的一部分将使名称不必要地加长。
下面是正确命名的类的示例。
public class FileStream
public class Button
public class String
二.8 接口命名指南
l 用名词或名词短语,或者描述行为的形容词命名接口。例如,接口名称 IComponent 使用描述性名词。接口名称 ICustomAttributeProvider 使用名词短语。名称 IPersistable 使用形容词。
l 使用 Pascal 大小写。
l 少用缩写。
l 给接口名称加上字母 I 前缀,以指示该类型为接口。
l 在定义类/接口对(其中类是接口的标准实现)时使用相似的名称。两个名称的区别应该只是接口名称上有字母 I 前缀。
l 不要使用下划线字符 (_)。
以下是正确命名的接口的示例。
public interface IServiceProvider
public interface IFormatable
以下代码示例阐释如何定义 IComponent 接口及其标准实现 Component 类。
public interface IComponent
{
// Implementation code goes here.
}
public class Component: IComponent
{
// Implementation code goes here.
}
二.9 属性命名指南
应该总是将后缀 Attribute 添加到自定义属性类。以下是正确命名的属性类的示例。
public class ObsoleteAttribute{}
二.10 枚举类型命名指南
枚举 (Enum) 值类型从 Enum 类继承。以下规则概述枚举的命名指南:
l 对于 Enum 类型和值名称使用 Pascal 大小写。
l 少用缩写。
l 不要在 Enum 类型名称上使用 Enum 后缀。
l 对大多数 Enum 类型使用单数名称,但是对作为位域的 Enum 类型使用复数名称。
l 总是将 FlagsAttribute 添加到位域 Enum 类型。
二.11 静态字段命名指南
以下规则概述静态字段的命名指南:
l 使用名词、名词短语或者名词的缩写命名静态字段。
l 使用 Pascal 大小写。
l 不要在静态字段名称中使用匈牙利语表示法的前缀。
l 建议尽可能使用静态属性而不是公共静态字段。
二.12 参数命名指南
必须仔细遵守这些参数的命名指南,这非常重要,因为提供上下文相关帮助和类浏览功能的可视化设计工具会在设计器中对用户显示方法参数名称。以下规则概述参数的命名指南:
l 对参数名称使用 Camel 大小写。
l 使用描述性参数名称。参数名称应当具有足够的描述性,以便参数的名称及其类型可用于在大多数情况下确定它的含义。例如,提供上下文相关帮助的可视化设计工具会按开发人员键入的实际内容显示方法参数。在这种情况下,方法参数名称的表述必须清楚明白,开发人员才能提供正确的参数。
l 使用描述参数的含义的名称,而不要使用描述参数的类型的名称。开发工具将提供有关参数的类型的有意义的信息。因此,通过描述意义,可以更好地使用参数的名称。少用基于类型的参数名称,仅在适合使用它们的地方使用它们。
l 不要使用保留的参数。保留的参数是专用参数,如果需要,可以在未来的版本中公开它们。相反,如果在类库的未来版本中需要更多的数据,请为方法添加新的重载。
l 不要给参数名称加匈牙利语类型表示法的前缀。
以下是正确命名的参数的示例。
Type GetType(string typeName)
string Format(string format, object[] args)
二.13 方法命名指南
以下规则概述方法的命名指南:
l 使用动词或动词短语命名方法。
l 使用 Pascal 大小写。
以下是正确命名的方法的实例。
RemoveAll()
GetCharArray()
Invoke()
二.14 属性命名指南
以下规则概述属性的命名指南:
l 使用名词或名词短语命名属性。
l 使用 Pascal 大小写。
l 不要使用匈牙利语表示法。
l 考虑用与属性的基础类型相同的名称创建属性。例如,如果声明名为 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
{
get {// Insert code here.}
set {// Insert code here.}
}
}
在不正确的示例中,不可能引用 Color 枚举的成员。Color.Xxx 将被解释为访问一个成员,该成员首先获取 Color 属性(在 Visual Basic 中为 Integer 类型,在 C# 中为 int 类型)的值,然后再访问该值的某个成员(该成员必须是 System.Int32 的实例成员)。
二.15 事件命名指南
以下规则概述事件的命名指南:
l 使用 Pascal 大小写。
l 不要使用匈牙利语表示法。
l 对事件处理程序名称使用 EventHandler 后缀。
l 指定两个名为 sender 和 e 的参数。sender 参数表示引发事件的对象。sender 参数始终是 object 类型的,即使在可以使用更为特定的类型时也如此。与事件相关联的状态封装在名为 e 的事件类的实例中。对 e 参数类型使用适当而特定的事件类。
l 用 EventArgs 后缀命名事件参数类。
l 考虑用动词命名事件。例如,命名正确的事件名称包括 Clicked、Painting 和 DroppedDown。
l 使用动名词(动词的“ing”形式)创建表示事件前的概念的事件名称,用过去式表示事件后。例如,可以取消的 Close 事件应当具有 Closing 事件和 Closed 事件。不要使用 BeforeXxx/AfterXxx 命名模式。
l 不要在类型的事件声明上使用前缀或者后缀。例如,使用 Close,而不要使用 OnClose。
l 通常情况下,对于可以在派生类中重写的事件,应在类型上提供一个受保护的方法(称为 OnXxx)。此方法只应具有事件参数 e,因为发送方总是类型的实例。
以下示例阐释具有适当名称和参数的事件处理程序。
public delegate void MouseEventHandler(object sender, MouseEventArgs e);
以下示例阐释正确命名的事件参数类。
public class MouseEventArgs : EventArgs
{
int x;
int y;
public MouseEventArgs(int x, int y)
{ this.x = x; this.y = y; }
public int X { get { return x; } }
public int Y { get { return y; } }
}
二.16 常量 (const)命名指南
以下规则概述事件的命名指南:
l 所有单词大写,多个单词之间用 "_" 隔开。 如
public const string PAGE_TITLE = "Welcome";
三、 编码规范
三.1 类命名规范
参考 类命名指南。
以下类派生的子类使用相应的后缀:
System.Attribute/Attribute
System.EventArgs/EventArgs
System.Exception/Exception
System.Collections.ICollection/Collection
System.Collections.IDictionary/Dictionary
System.Collections.IEnumerable/Collection
System.Collections.Queue/Collection or Queue
System.Collections.Stack/Collection or Stack
System.Collections.Generic.ICollection/Collection
System.Collections.Generic.IDictionary/Dictionary
System.Data.DataSet/DataSet
System.Data.DataTable/Collection or DataTable
System.IO.Stream/Stream
System.Security.IPermission/Permission
System.Security.Policy.IMembershipCondition/Condition
An event-handlerdelegate./EventHandler
三.2 类变量编码规范
原则上,在类内部不使用任何public变量,仅使用private变量。private变量的命名参考参数命名指南。其它参考如下:
l 使用Camel大小写,不要用匈牙利命名法。
l 对于bool类型,不要用b或f开头,应使用is或has等动词开头。
l 仅对于短循环索引使用单字母变量名,如 i 或 j。
l 对于声明为DataSet的变量,以ds开头。声明为DataTable的变量以table开头。
三.3 窗体类命名
用Pascal大小写,用名词或名词短语,或者描述行为的形容词命名窗体类,使用Form结尾,例如LoginForm,ProductDetailForm等窗体类名。
三.4 窗体内控件命名
窗体内控件用Camel大小写,使用该控件变量名称作为开头,后面接用名词或名词短语,或者描述行为的形容词。例如,buttonOK,labelAge,textBoxName,checkBoxIsMember等。具体只须把原控件名称中末尾的数字改为控件名称,象button1改为buttonOK。
由于窗体也是控件的子类,声明为窗体的变量命名也类似,但可能窗体类名中已包含用途,所以可以不加任何后缀,仅以Camel大小写命名其变量。例如LoginForm的实例命名为loginForm。
三.5 窗体内非控件变量命名
参考 类变量编码规范。
三.6 文件夹及命名空间分布
l 项目根文件夹下尽量少文件,仅放置启动类,也可以放配置文件。
l 把用途相似或行为并列的类放到同一个文件夹中,文件夹命名参考命名空间的命名指南,文件夹尽量保持与类所在的命名空间一致。
l 资源包括图片、音频等放置到资源目录。
三.7 方法编码规范简述
对于每个类里面的方法,规范较多并且复杂,以下简述一些:
l 方法命名应以动词或动词短语开头,后面可加名词或形容词表示动作的对象或结果。例如ToString(),Show(),Refresh()等。
l 方法的参数用该方法的动词的对象命名。例如Delete(Student student)。
每个方法代码行数不应超过100行。尽量把集中的动作移到另外的方法中,并准确命名。

浙公网安备 33010602011771号