我应该在C#中使用匈牙利应用程序符号吗?

我应该在C#中使用匈牙利应用程序符号吗?,c#,coding-style,hungarian-notation,C#,Coding Style,Hungarian Notation,我知道有人问过这个问题,从表面上看,这个问题没有一个明确的是或不是的答案,但我还是有点困惑 通常在编程时,我会遵循一些有关前缀的规则: 在会员面前 物业前面的p_uu 在静电传感器前面 参数前面的a_uu 局部变量前面的l_u 我现在找到了一份新工作,我注意到代码中没有使用前缀。我问了为什么,他们回答说IDE负责跟踪什么是成员变量,什么是局部变量。现在我在想,也许是这样,但是前缀的使用不是更容易吗 我的意思是,例如,如果我有一个成员、一个静态变量和一个名为“robot”的局部变量,那么在编写

我知道有人问过这个问题,从表面上看,这个问题没有一个明确的是或不是的答案,但我还是有点困惑

通常在编程时,我会遵循一些有关前缀的规则:

  • 在会员面前
  • 物业前面的p_uu
  • 在静电传感器前面
  • 参数前面的a_uu
  • 局部变量前面的l_u
我现在找到了一份新工作,我注意到代码中没有使用前缀。我问了为什么,他们回答说IDE负责跟踪什么是成员变量,什么是局部变量。现在我在想,也许是这样,但是前缀的使用不是更容易吗

我的意思是,例如,如果我有一个成员、一个静态变量和一个名为“robot”的局部变量,那么在编写方法时引用它不是一件痛苦的事吗?这也许是一个不切实际的例子,但我喜欢在头脑中建立一个好的规则,我可以始终如一地应用,即使是在不现实的条件下

这个例子证明使用匈牙利符号是正确的吗

我想我会做一个优点/缺点列表,并在了解更多信息后进行编辑

反对匈牙利语的论点:

Class.Robot
Robot

this.robot

机器人

不需要匈牙利语

计数器:

仍然存在不一致性,机器人可以用不同的方法表示不同的事情。为了保持一致,您应该在每个Robot变量之前加上Class或this(或nothing)前缀

最重要的是,假设您想要访问静态变量草莓,您怎么知道名为草莓的成员变量没有定义?可能它是在另一个文件中定义的,您无法看到,因此您可能会得到意外的结果。现在您可能会说这是通过IDE可见的,但我认为使用前缀更优越,因为您可以看到所引用的内容,而您可能会错过IDE告诉您的内容。当然,您也可以使用这个/Classname前缀,但这样做会破坏不使用匈牙利符号的目的

反对匈牙利语的论点:

如果在字段和变量的命名中使用匈牙利符号,则会违反此规则。匈牙利符号的用法在C++代码中已经广泛使用,但是C语言的趋势是使用更长的、更描述性的变量名,这些变量不是基于变量的类型,而是描述变量使用的变量。 计数器:

我提到的前缀不是基于变量的类型,前缀确实指定了变量用于什么

反对匈牙利语的论点:

VisualStudio等现代代码编辑器可以轻松识别变量或字段的类型信息,通常是将鼠标光标悬停在变量名称上。这减少了对匈牙利符号的需要

计数器:

虽然这是事实,但我自己几乎从不将鼠标悬停在变量名上方,除非发生错误。相反,使用匈牙利符号,您可以立即看到变量在类中的位置

备注:


微软不建议文件名使用匈牙利符号吗?我读到用I作为接口文件的前缀是一种惯例,这是匈牙利符号的一种形式。虽然这与我上面的问题没有直接关系,但它确实提出了一点,即有时建议使用匈牙利符号。

不,不要使用匈牙利符号。首先,现在是90年代。第二,你可能会被你的同事袭击…;-)

您的机器人示例:

Class.Robot
Robot

this.robot

机器人


不需要匈牙利语。

不,不要这样做。这使得代码更难阅读。如果你写英语时每个动词前面都有一个v_u,每个名词前面都有一个n_u,这会使句子更难读,同时会添加一些在大多数情况下都不有用的信息

如果你的类设计得很好,责任少,方法短,那么从名称和使用它的上下文中找出每个变量的含义应该不会太难。当它不明显并且您需要知道时,很容易找到:您可以将鼠标悬停在变量名上,或者按“转到定义”

StyleCop有一个警告,当您使用匈牙利符号时会发出警告。规则说明对该规则存在的原因有一些解释:


  • TypeName字段名称不得用于注释
  • CheckId SA1305
  • 类别命名规则
原因

C#中字段或变量的名称使用匈牙利符号

规则说明

如果在字段和变量的命名中使用匈牙利符号,则会违反此规则。匈牙利符号的用法在C++代码中已经广泛使用,但是C语言的趋势是使用更长的、更描述性的变量名,这些变量不是基于变量的类型,而是描述变量使用的变量。
此外,VisualStudio等现代代码编辑器使识别变量或字段的类型信息变得容易,通常是将鼠标光标悬停在变量名称上。这就减少了对匈牙利符号的需要。

我自己也遵循一些惯例。的确,现代IDE带走了很多这样的东西,但我还是觉得有点匈牙利的:)。我正在使用:

robot_uu用于属性(ms建议使用this.robot,但像这样我不能忘记this)
局部变量和私有/受保护/内部方法的camelCase
公共属性或方法的PascalCase

就是这样:)。我认为代码看起来