前言
命名规则,其实是一种约定俗成的定义方式。旨在使多数开发人员在编程时统一编程模型,易于代码理解。
接触过的多种编程语言,都有不一样的命名规则,难免经常会混淆。
单独记录一篇日志,方便自己加深印象。
遇到混淆或有遗忘时,亦可翻出来重新看看。
全文参考来自微软官方文档,具体参考“.Net框架设计准则”
常见的变量命名方法
- PascalCase(帕斯卡命名法)
PascalCase 正如它的名称一样,要求规定每个单词的首字母为大写,不要使用下划线或连字符来区分单词。适用于除了参数名称外的所有标识符。
例如:SetFirstClass - camelCase(驼峰命名法)
camelCase要求规定将每个单词的首字母(除第一个单词之外)大写,不要使用下划线或连字符来区分单词。仅适用于参数名称。
例如:firstClassName - Hungarian Notation(匈牙利命名法)
通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等。
例如:i_CalssNumber
命名法的使用规定
- ✔️作为公共成员*1、类型和命名空间的标识符名称,使用 PascalCasing命名规则。
- ✔️作为私有成员*1和参数 的标识符名称,使用camelCase命名规则。
- ❌匈牙利命名法不准许被使用在C#语法中。
- ✔️关于组合词和常见术语,将大多数组合术语视为一个单词。(如:Callback,Gridline,Endpoint)
- ❌关于缩写词,不要使用未被广泛接受的缩写词;如遇两个字母的缩写词,两个字母均采用大写或小写。(如:Xml,Html,IO,ip,Email)
- ✔️遵循标识符易读性强原则,不使用强制缩写的简洁性名称。
- ❌避免使用编程语言特有的名称。(这一块理解不是很透彻,针对int,byte这些特有名称适当合理使用,不要产生错误引导)
- ✔️如有API版本区分,应该在原有标识符后添加后缀,而不是前缀;如方法发生本质变更,则不允许使用添加后缀来区分,应该重命名。(如:x86 和 x64)
- ✔️程序集名称应该体现整体性,建议直接使用模板 “<Company>.<Component>.dll”(如:Litware.Controls.dll)
- 命名空间名称,建议直接套模板 “ <Company>.(<Product>|<Technology>)[.<Feature>][.<Subnamespace>]”
- 类、类成员、结构和接口名称,应合理使用适当的词性(动词,形容词,名词)。
应用举例
//直接模板套用,PascalCasing命名法
namespace MyCompany.Training.Courses
{
//枚举值:公有成员,PascalCasing命名法
public enum CourseType
{
Lecture,
Studio,
Practicum,
}
//类:公有成员,PascalCasing命名法
public class NamingGuidelines
{
//字段(通常情况下,应仅对具有 private 或 protected 可访问性的变量使用字段)。
//使用名词、名词性短语或形容词为字段命名。
//此处定义一个私有成员date,camelCasing命名法。
private uint totalChapters;
//常量:公有成员,PascalCasing命名法。
public const String CourseTitle = "C# .Net Naming Guidelines";
//属性:公有成员,PascalCasing命名法。
//应向属性给定名词性短语或形容词性名称。
public int ChapterNumber { get; set; }
//如属性设置值为枚举参考值时,可以考虑使用同等名称:
public CourseType CourseType { get; set; }
//方法:公有成员,PascalCasing命名法, 请不要将“Read”命名为“Get”
//参数:私有成员,camelCasing命名法
public String ReadCourseCatalog(int numberOfChapter)
{
return ($"List {numberOfChapter} out of {totalChapters} chapter titles.");
}
//方法:公有成员,PascalCasing命名法,
//注意,is并不是缩写单词,不必写成“IS”或“is”
public bool IsStarted() { return false; }
//事件:公有成员,PascalCasing命名法,事件用谓词命名,并用谓词时态指示引发事件的时间
public event EventHandler CourseEnding;
//接口
//务必在接口名称前加上字母 I,表示该类型是一个接口
//务必用形容词短语(或偶尔用名词或名词短语)命名接口
interface IEquatable<T>
{
bool Equals(T obj);
}
}
}
拓展参考:
命名规范(3)标识符的命名
宏定义命名规范