C# 变量前缀(“;匈牙利符号”;)真的还需要吗?
既然C#是强类型的,我们真的还需要给变量加前缀吗 e、 gC# 变量前缀(“;匈牙利符号”;)真的还需要吗?,c#,naming-conventions,hungarian-notation,C#,Naming Conventions,Hungarian Notation,既然C#是强类型的,我们真的还需要给变量加前缀吗 e、 g 过去我经常使用前缀,但今后我看不到任何好处。没有。我们需要吗?不需要。只是给代码添加了不必要的干扰,而且编译器类型检查是多余的。匈牙利符号很难看。唯一的例外是接口,大多数人认为它是可以接受的 莱纳斯很好地总结了这一点: “将函数类型编码为名称(所谓的匈牙利符号)会对大脑造成损害-编译器无论如何都知道类型,并且可以检查这些类型,这只会让程序员感到困惑”前缀是VB(以及更早的版本!)在位时遗留下来的。现在的情况已经不是这样了,尽管C#类似于
过去我经常使用前缀,但今后我看不到任何好处。没有。我们需要吗?不需要。只是给代码添加了不必要的干扰,而且编译器类型检查是多余的。匈牙利符号很难看。唯一的例外是接口,大多数人认为它是可以接受的 莱纳斯很好地总结了这一点:
“将函数类型编码为名称(所谓的匈牙利符号)会对大脑造成损害-编译器无论如何都知道类型,并且可以检查这些类型,这只会让程序员感到困惑”前缀是VB(以及更早的版本!)在位时遗留下来的。现在的情况已经不是这样了,尽管C#类似于在接口中使用大写前缀
I
(例如ILoadable
)
当前的Microsoft指南是
变量前缀(匈牙利语)真的还需要吗
不
事实上,微软自己的公司(这种做法的发源地)现在建议不要这样做。特别是,请参见上的一节,其中包括以下文本(粗体,不少于):
不要使用匈牙利符号。
当然,这些指导原则在微软之外没有约束力或强制性。然而,这是平台供应商发布的建议,它不仅仅是从之前的任何指南中删除积极建议,而是今天措辞强硬并强调的消极建议
换句话说,不要再使用它们。不,如果你的方法太长,以至于你不能在使用的同时阅读定义,或者名称并不意味着类型,那么你就有比命名更严重的设计问题
<>但是,我坚持要用它们的类型做前缀控件,比如txtNeX.,我认为C的唯一前缀是成员变量,例如。
public class Test
{
private int _id;
}
我个人不再这样做了,但是你们仍然会有人争论范围的前缀 我和微软一起使用他们的命名约定。在我看来,整个“类库开发人员设计指南”部分(该链接是其中的一部分)都是纯金的
此外,我喜欢Addison Wesley的《框架设计指南》一书。它涵盖了所有这些指导原则,并附有Microsoft团队成员的注释,说明他们为什么推荐他们的建议以及如何在组织内采用这些建议。有关良好惯例的概述,请参见此处:
有一本书是关于这一点的,他们在书中解释了每一个惯例背后的原因。非常有趣的阅读。尽管编译器可以快速轻松地检查变量的类型,但人类在浏览一段源代码时无法做到这一点。 因此,有些人(像我一样)更喜欢让变量名更详细一些,这样可以很快识别出它们是全局变量或类变量、字符串或int等
这可能对编译器没有帮助,但在读取一段外来代码时,它确实可以节省您手动查找每个变量的时间…好吧,我想说的是,要进行计数,这取决于具体情况。我个人反对他们,但这取决于你的团队。每个团队都应负责制定自己的指导方针。希望这不包括所谓的匈牙利符号,但它真的应该是一个团队的决定。您可能会发现您想要打破样式指导原则的情况。我想说,在目前大多数类型集有限的语言中,特别是没有无符号类型的概念,那么一个命名良好的变量不应该需要前缀 在有符号和无符号类型的语言中,或者在一系列类似类型的语言中(例如short、int、long或Int8、Int16、In32),前缀是有用的,不管其他人说了什么(你知道他们会说什么)
当您尝试在表达式中混合不同符号的整数类型时,编译器最多会发出警告,例如,如果您将IDE配置为在最终摘要中仅显示生成中的错误(而不是警告)(就像使用Visual Studio所做的那样),则很容易忽略此警告。在算术中混用符号会严重破坏你的一天,因此,省得你或你的继任者头疼,给他们一个线索。请记住-您不是唯一一个会查看代码的人。我认为唯一适合弯曲标准和前缀变量的地方:
- 控件名:
——我知道我不是唯一一个。很好的一点是,您可以在txtName旁边找到类似lblName的内容,而不需要进入namelab/NameTextBox方向txtWhatever
- 类成员变量:
。我尝试了m_u和no前缀,结果得到了简单的下划线。m_更难输入,没有前缀有时会让人困惑(特别是在维护期间,我知道你们所有人在编写代码时都会记住他们的代码)\u无论什么
public class Test
{
private int _id;
}
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)
t_ for table name
v_ for view name
i_ for index name
trig_ for trigger
sp_ for stored procedure name
p_ for parameter
v_ for variable
c_ for cursor
r_ for record