由于C#是强类型的,我们真的需要为变量添加前缀吗?
例如
iUserAge iCounter strUsername
我以前曾经用过前缀,但是前进我看不出任何好处.
变量前缀(匈牙利语)真的有必要吗?
没有!
实际上,微软自己的风格指南(实践起源于此)现在建议不要使用它.特别是,请参阅" 常规命名约定"一节,其中包括以下文本(粗体,不少):
不要使用匈牙利表示法.
我认为唯一适合弯曲标准和前缀变量的地方:
控制名称:txtWhatever
- 我看到我不是唯一的一个.好处是你可以在txtName旁边找到像lblName这样的东西,你不需要进入NameLabel/NameTextBox方向.
类成员变量:_whatever
.我已经尝试了m_和没有前缀,结果是简单的下划线.m_更难以打字,并且没有前缀有时会让人感到困惑(特别是在维护期间,我知道你们所有人都在编写代码时心里明白他们的代码)
我没有找到任何一致的情况,其中为变量添加其类型前缀会使代码更具可读性.
编辑:我确实阅读了Microsoft指南.但是我认为在适当的情况下允许编码样式发展和/或"弯曲".正如我上面提到的,我发现使用下划线前缀对试验和错误有用,并且肯定比使用它更好.无论代码中的任何地方.
支持"不断发展"的理论 - 回到.NET 1.x,当微软发布编码指南时,他们建议使用Camel套管来处理所有事情,甚至是常量.我现在看到他们已经改变并建议使用Pascal案例用于常量或公共只读字段.
此外,甚至.NET Framework类库目前还充满了m_和_和s_(尝试使用Reflector浏览实现).毕竟,只要在整个项目中保持一致性,就由开发人员决定.
如果匈牙利语的意思是"带有类型缩写的前缀",例如uCount或pchzName,那么我会说这种做法很糟糕,幸好似乎正在逐渐淡化常用.
但是,我仍然认为前缀对范围非常有用.在我的工作室,我们使用此约定为变量添加前缀:
i_ // input-only function parameter (most are these) o_ // output-only function parameter (so a non-const & or * type) io_ // bidirectional func param _ // private member var (c#) m_ // private member var (c++) s_ // static member var (c++) g_ // global (rare, typically a singleton accessor macro)
我发现这非常有用.特别是func参数前缀是有用的.在函数内部,您可以随时了解var的来源.通常,当我们想要修改或更改其含义时,我们会将var复制到另一个.
简而言之:现代工具不需要类型的前缀.IDE负责为您识别和检查这些内容.但基于范围的前缀对于可读性和清晰度非常有用.
Intellisense也有很多有趣的好处.您可以键入i_ ctrl-space并获取func的所有输入参数以供选择.或者g_ ctrl-space来获取你所有的单身人士.这是节省时间的.
不.难道我们永远需要?
匈牙利表示法很难看.唯一的例外是接口,大多数人认为它是可以接受的.
Linus总结得很好:"将函数的类型编码到名称中(所谓的匈牙利符号)是脑损坏的 - 编译器无论如何都知道类型并且可以检查这些类型,它只会让程序员感到困惑"
不.匈牙利表示法只会给代码增加不必要的噪音,并且在编译器类型检查时是多余的.
是的,如果使用匈牙利符号,原来的意思是,而不是微软实施的.与上面的示例非常相似,它将文本框和相应的标签显示为lblWhatever,txtWhatever.用它来定义变量的使用,而不是类型.它可以提供信息,知道您的号码是moneyTotal,这不仅告诉我数据类型.
但是,如常用?没有.