我这几天有一个疑惑,我之前用过一些变量命名,有些混乱,如string sql,string strSql,string sqlStr, string strName,string nameStr,bool boValid,stringbuilder sbFileNames, gridcontrolPerson,textbox txtFilter。我之所以加是想着在编码的时候知道他是什么类型的,但是我有时候前缀写在前面,有时候写在后面,很混乱,我已我查了资料,想规范自己的写法。以下是得到的结论。
对于常见的自定义变量命名
1. 前缀与后缀的使用
2. 官方命名准则
微软的C#编码规范明确指出:
1公共成员、类型和命名空间使用PascalCase命名规则
2私有成员和参数使用camelCase命名规则
3微软框架设计指南反对这种命名方式
4明确禁止使用匈牙利命名法
因此
1变量名应具有描述性,避免包含类型信息
2在C#或Java等这种强类型语言中,变量类型已经明确声明,前缀冗余
3在变量类型已明确的情况下(string),这种后缀没有必要
4可能引起混淆(是表示"字符串"还是某种缩写?)
推荐写法
string name; // 最简洁清晰的写法
string fullName; // 需要更多描述时
string customerName; // 上下文需要明确时
同理Stringbuilder sb,或Stringbuilder sbFiles也是匈牙利写法,我一看它就能知道它是拼接字符串的,应该如何改善呢。
推荐写法
StringBuilder names = new StringBuilder(); // 标准写法
StringBuilder nameBuilder = new StringBuilder(); // 需要强调用途时// 个人决定以后这么写
为何微软反对匈牙利写法?
匈牙利命名法(Hungarian Notation)是一种编程命名规范,其基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。
由微软程序员查尔斯·西蒙尼(Charles Simonyi)在20世纪80年代提出,他是一位匈牙利裔程序员,因此得名。
核心思想:通过变量名前缀直观反映变量的类型或用途
最初在微软内部流行,后通过微软产品和文档向世界传播。
如C/C++中
int iMyAge; // "i"表示int类型
char cMyName[10]; // "c"表示char类型
float fManHeight; // "f"表示float类型
但现在的强类型语言,都转为语义命名,如
Apache项目:采用清晰的语义命名,如userName、itemList等,避免类型前缀
现代趋势:大型开源项目普遍转向语义化命名,仅保留少量特殊前缀(如m_表示成员变量,g_标识全局变量)
匈牙利命名法作为特定历史时期的产物,其核心价值已被现代开发工具和实践所替代,但其强调代码可读性的理念仍然值得借鉴。开发者应根据项目特点和团队规范,选择最适合的命名策略。
那关于UI控件命名呢,我需要一眼看出我这个变量是列,还是文本框,总不能也省略吧。资料总结如下
微软官方对于UI控件命名并没有强制规定必须使用前缀,但在实际开发中,特别是在WinForms和WPF项目中,开发者社区形成了一些约定俗成的做法。对于UI控件,特别是复杂UI中的同类控件,微软文档中暗示了使用前缀有助于区分控件类型。WPF控件命名指南建议使用有意义的名称,但没有明确禁止前缀。
而当同一窗体有多个同类控件时,前缀更有优势。
所以建议前缀使用情况:
gc前缀表示GridControl(如gcEmployees)
gv前缀表示GridView(如gvOrders)
col或gc前缀表示GridColumn(如colName或gcName)
txt前缀标识Text(如txtFilter或txt_filter)
示例:
// DevExpress GridControl常见命名方式
GridControl gcMainData = new GridControl();
GridView gvDetailView = new GridView(gcMainData);
GridColumn colID = new GridColumn("ID");// 推荐命名方式示例
GridControl gcCustomer = new GridControl(); // 使用前缀
GridView gvCustomerDetails = new GridView(gcCustomer);
GridColumn colCustomerName = new GridColumn("Name");// 或者语义化命名(也可参考)
GridControl customerGrid = new GridControl();
GridView detailsView = new GridView(customerGrid);
GridColumn nameColumn = new GridColumn("Name");// 个人极不推荐
GridControl gc = new GridControl();
GridControl grid = new GridControl();
GridControl customer= new GridControl();