程序集和DLL的命名
程序集是一个部署单元,同时还代表托管程序的身份,虽然程序集可以分布在一个或多个文件中,但一般一个程序集仅与一个DLL相对应。夸文件的程序集很少使用,Visual Studio也没有支持他的内建。
命名空间与DLL和程序集是不同的概念,命名空间对开发人员来说是一组逻辑实体,而DLL和程序集则是用于打包和部署的一个单元。DLL可以包含多个命名空间,由于命名空间的组织方式与DLL不同,所以可以单独设计,而不需要讲两者强制关联。
要为程序集和DLL选择具有代表性的名字,如System.Data,这样很容易就知道它的大致功能。
考虑用<Company>.<Component>.dll的模式给DLL命名。其中<Component>可以包含多个圆点分隔的子句,如Microsoft.VisualBasic.dll Microsoft.VisualBasic.Vsa.dll。
命名空间的命名
命名空间模板:<Company>.(<Product>|<Technology>)[.<Feature>][.<Subnamespace>]
要用公司的名称作为命名空间的前缀。
要用稳定的、与版本无关的产品名称作为命名空间的第二层。
不要根据公司的组织架构来决定命名空间的层次结构,因为公司内部组织经过一段时间之后可能会发生改变。要根据相关技术来组织和划分命名空间的层次结构。
考虑适当的时候在命名空间中使用复数。如:System.Collections
不要用相同的名字给命名空间和类型命名。
命名空间与类名的冲突
不要引入太一般化的类型名,如Node、Element、Log及Message,这样的名字很可能会在常见的场景中引起类型名的冲突,应该给一般化的类型名加上限定符(XmlNode、FormElement、...)。
对于不同的命名空间,有具体的规范来避免类型名冲突。命名空间的类型如下:
应用程序模型命名空间(application model namespace)
基础设施命名空间(infrastructure namespace)
核心命名空间(core namespace)
技术命名空间组(technology namespace group)
不要在单个应用程序模型中为命名空间中的多个类型起相同的名字。
不要给类型起会与核心命名空间中的任何类型产生冲突的名字。如Stream很容易和System.IO.Stream冲突。
不要给类型会与同一技术中的其他类型产生冲突的名字。
不要在技术命名空间和应用程序模型命名空间的类型之间引入类型名冲突(除非两者不打算一起使用)。
类、结构和接口的命名
要用名词或名词短语来给类和结构命名。如果无法找到一个名词或名词短语,那就应该重新考虑该类型的总体设计;另一种选择类型名字的方法是通过场景的角度。
要用形容词短语来命名接口,在少数情况下也可以用名词或名词短语。
不要给类名加上符号“C”作为前缀。
要让接口的名字已字母“I”开头,这样可以显示出该类型是一个接口。
泛型类型参数的命名
要用描述性的名字来命名泛型类型参数,除非一个字母就能说明含义就无需使用描述性的名字,如List<T>、Convert<TInput,TOutput>。
考虑用单个字母“T”来命名参数类型,如果类型只有一个类型参数且类型参数只有一个字母。
要给描述性的类型参数名加上“T”前缀。
考虑在类型参数名中显示出施加于该类型参数上的约束。
常用的类型命名
如果要从.NET框架中所包含的类型派生新的类型,或者实现.NET框架中的类型,那么应该遵循下表中的规范。
枚举类型的命名
要用单数名词来命名枚举类型,除非它表示的是位域(bit field),即位域要用复数名词来命名。
1 public enum ConsoleColor { 2 Black, 3 Blue, 4 Red 5 //... 6 } 7 8 [Flags] 9 public enum ConsoleModifiers { 10 Alt, 11 Control, 12 Shift 13 }
类型成员的命名
方法的命名
要用动词或动词短语来命名方法。
属性的命名
要用名词、名词短语或形容词来命名属性
要用描述集合中项目短语的复数形式来命名集合属性,而不要使用短语的单数形式加“List”或“Collection”后缀。
要用肯定性的短语来命名布尔属性,可以选择“Is”、“Can”、“Has”等前缀。
考虑用属性的类型名来命名属性
1 public enum Color{/*...*/} 2 3 public class Control { 4 public Color Color { get; set; } 5 }
事件的命名
要用动词或动词短语来命名事件。
要用现在时和过去时来赋予事件名以之前和之后的概念。如Colse事件的Colosing(关闭前)、Colsed(关闭后)。
要在命名事件处理函数(用作事件的委托)时加上“EventHandler”后缀。
要在事件处理函数中用sender和e作为两个参数的名字。
字段的命名
要用名词、名词短语或形容词来命名字段。
不要给字段(静态共有字段和静态受保护字段)名加前缀,但是大家都喜欢给私有字段加上“_”前缀。
对于静态共有字段和静态受保护字段命名时要用算驼峰风(PascalCasing)格。
参数的命名
要使用描述性的参数名。
考虑根据参数的意思而不是参数的类型来命名参数。
重载操作符的参数命名
要使用left和right来命名重载二元操作符的参数。
要用value来命名重载一元操作符的参数。
考虑使用有意义的名字来命名重载操作符的参数。
不要在命名重载操作符的参数时,使用缩写或数字编号。
资源的命名
本地资源就好比是属性,所以命名方式与属性的命名规范相似。
要在命名资源键(resource key)时使用PascalCasing大小写风格。
要使标识符的名字具有描述性,而不是注重简洁性。
资源名一般是有字母、数字、下划线组成。(有时候我也会用中文,但不知道会不会有字符编码的问题)