c#编程
本节将定义C#开发社区普遍接受的命名约定。一些公司可能会定义不同的命名约定,但这种做法通常是根据个别需求进行的,而且一般不提倡。本节中讨论的一些对象可能超出了读者当前的知识范围,但可以稍后参考本节内容。
理由
大部分命名标准源自微软的.NET框架库。这些标准已被证明能使名称在“一眼看上去”时具有可读性和可理解性。通过使用正确的命名约定来命名对象,您可以确保其他C#程序员在阅读您的代码时能够轻松理解对象的含义,而无需在代码中搜索其定义。
命名约定
命名空间
命名空间使用Pascal命名法(也称为大驼峰命名法),且不使用下划线。这意味着名称中的每个单词的首字母都应大写。例如:MyNewNamespace
。Pascal命名法还意味着,三个或更多字母的缩写应该只大写第一个字母(例如:MyXmlNamespace
,而不是MyXMLNamespace
)。
程序集
如果一个程序集仅包含一个命名空间,那么程序集和命名空间应使用相同的名称。否则,程序集应遵循常规的Pascal命名法。
类和结构体
使用Pascal命名法,不使用下划线,也不使用以C、cls或I开头的前缀。类名不应与其所在的命名空间相同。三个或更多字母的缩写应使用Pascal命名法,而不是全部大写。尽量避免使用缩写,并尽量始终使用名词。
异常类
遵循类命名约定,但在名称末尾添加Exception
。在.NET 2.0中,所有类应该继承自System.Exception
基类,而不是继承自System.ApplicationException
。
接口
遵循类命名约定,但接口名称应以I
开头,并且I
后的字母大写。例如:IFoo
。I
前缀有助于区分接口和类,并避免名称冲突。
函数
使用Pascal命名法,不使用下划线,除非是事件处理程序。尽量避免使用缩写。许多程序员有过度缩写一切的坏习惯,应当避免这种做法。
属性和公共成员变量
使用Pascal命名法,不使用下划线。尽量避免使用缩写。
参数和过程级变量
使用Camel命名法(或小驼峰命名法)。尽量避免使用缩写。Camel命名法与Pascal命名法相同,只是第一个单词的首字母小写。
类级私有和保护变量
使用Camel命名法,并在变量前加下划线。在声明时始终指明变量是私有的还是保护的。前导下划线是本文件中唯一具有争议的部分。这个前导字符有助于防止在构造函数中发生名称冲突(即参数和私有变量具有相同的名称)。
表单控件
使用Pascal命名法,并加上前缀,标识它是UI的一部分,而不是纯粹的代码控件(例如临时变量)。许多开发人员使用ui
作为前缀,后跟描述性名称,如txtUserName
或lblUserNickName
(txt
代表TextBox控件,lbl
代表Label控件)。
这实际上是Camel命名法;此外,这种命名约定被称为匈牙利命名约定,在现代编程中通常不推荐使用。使用此命名约定的变量名称像lblSurname
或tbSurname
,而不是surnameLabel
或surnameTextBox
。这种命名方法的附加优势是,类似的UI元素在IntelliSense中按字母顺序连续列出。
Some samples are below for ASP.Net web form controls:
Control | Prefix | Example |
---|---|---|
Label | lbl | lblSurname |
TextBox(ASP.Net) | tb | tbSurname |
TextBox(WinForms) | txt | txtUserName |
DataGrid | dg | dgResults |
GridView | gv | gvResults2 |
Button | btn | btnSave |
ImageButton | iBtn | iBtnSave |
Hyperlink | lnk | lnkHomePage |
ComboBox | cmb | cmbYear |
DropDownList | ddl | ddlCompany |
ListBox | lst | lstCompany |
DataList | dLst | dLstAddress |
DataSet | ds | dsInvoices |
DataTable | dt | dtClients |
DataRow | dr | drUser |
Repeater | rep | repSection |
Checkbox | chk | chkMailList |
CheckBoxList | chk | chkAddress |
RadioButton | rBtn | rBtnGender |
RadioButtonList | rBtn | rBtnAgeGroup |
Image | img | imgLogo |
Panel | pnl | pnlSevtion |
PlaceHolder | plh | plhHeader |
Calendar | cal | calMyDate |
AdRotator | adr | adrBanner |
Table | tbl | tblResults |
[All] Validators | val (N/A) | valCreditCardNumber |
ValidationSummary | vals (N/A) | valsErrors |
常量
常量使用Pascal命名法。强烈不推荐使用SCREAMING_CAPS。这与早期的约定相比是一个很大的变化。大多数开发人员现在意识到,使用SCREAMING_CAPS会暴露出不必要的实现细节。《.NET框架设计指南》中的一大部分内容专门讨论了这个问题。
以下是一个示例类,结合了所有这些命名约定:
using System;
namespace MyExampleNamespace
{
public class Customer : IDisposable
{
private string _customerName;
public string CustomerName
{
get
{
return _customerName;
}
set
{
_customerName = value;
_lastUpdated = DateTime.Now;
}
}
private DateTime _lastUpdated;
public DateTime LastUpdated
{
get
{
return _lastUpdated;
}
private set
{
_lastUpdated = value;
}
}
public void UpdateCustomer(string newName)
{
if (!newName.Equals(CustomerName))
{
CustomerName = newName;
}
}
public void Dispose()
{
// 不做任何操作
}
}
}