Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 变量前缀(“;匈牙利符号”;)真的还需要吗?_C#_Naming Conventions_Hungarian Notation - Fatal编程技术网

C# 变量前缀(“;匈牙利符号”;)真的还需要吗?

C# 变量前缀(“;匈牙利符号”;)真的还需要吗?,c#,naming-conventions,hungarian-notation,C#,Naming Conventions,Hungarian Notation,既然C#是强类型的,我们真的还需要给变量加前缀吗 e、 g 过去我经常使用前缀,但今后我看不到任何好处。没有。我们需要吗?不需要。只是给代码添加了不必要的干扰,而且编译器类型检查是多余的。匈牙利符号很难看。唯一的例外是接口,大多数人认为它是可以接受的 莱纳斯很好地总结了这一点: “将函数类型编码为名称(所谓的匈牙利符号)会对大脑造成损害-编译器无论如何都知道类型,并且可以检查这些类型,这只会让程序员感到困惑”前缀是VB(以及更早的版本!)在位时遗留下来的。现在的情况已经不是这样了,尽管C#类似于

既然C#是强类型的,我们真的还需要给变量加前缀吗

e、 g


过去我经常使用前缀,但今后我看不到任何好处。

没有。我们需要吗?

不需要。只是给代码添加了不必要的干扰,而且编译器类型检查是多余的。

匈牙利符号很难看。唯一的例外是接口,大多数人认为它是可以接受的

莱纳斯很好地总结了这一点:
“将函数类型编码为名称(所谓的匈牙利符号)会对大脑造成损害-编译器无论如何都知道类型,并且可以检查这些类型,这只会让程序员感到困惑”

前缀是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所做的那样),则很容易忽略此警告。在算术中混用符号会严重破坏你的一天,因此,省得你或你的继任者头疼,给他们一个线索。请记住-您不是唯一一个会查看代码的人。

我认为唯一适合弯曲标准和前缀变量的地方:

  • 控件名:
    txtWhatever
    ——我知道我不是唯一一个。很好的一点是,您可以在txtName旁边找到类似lblName的内容,而不需要进入namelab/NameTextBox方向

  • 类成员变量:
    \u无论什么
    。我尝试了m_u和no前缀,结果得到了简单的下划线。m_更难输入,没有前缀有时会让人困惑(特别是在维护期间,我知道你们所有人在编写代码时都会记住他们的代码)

不过,我没有发现任何一致的情况,即在变量前面加上类型前缀会使代码更具可读性

编辑:我确实读过微软的指南。然而,我认为,编码风格允许演变和/或“弯曲”,在适当的情况下。正如我上面提到的,我发现通过反复试验,使用下划线前缀非常有用,而且肯定比在代码中的任何地方使用this.whatever都要好

支持“进化”理论——早在.NET1.x中,当微软发布编码指南时,他们建议对所有内容使用驼峰式外壳,甚至是常量。我现在看到他们已经改变了,建议对常量或公共只读字段使用Pascal case

此外,即使是.NETFramework类库目前也充满了m_u和u和s_u(尝试使用Reflector浏览实现)。毕竟,这取决于开发人员,只要c
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