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

标签 c# coding-style hungarian-notation

我知道这个问题已经被问了一些,从表面上看,这个问题没有明确的是或否的答案,但我仍然对某些事情有点困惑。

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

  • m_ 在成员面前
  • p_ 在属性前面
  • s_在静态前面
  • a_在参数前面
  • l_在局部变量前面

我现在找到了一份新工作,我注意到代码中没有使用前缀。我问为什么,他们回答说 IDE 会完成所有跟踪成员变量和局部变量的工作。现在我在想,可能是这样,但是无论如何使用前缀不是更容易吗?

我的意思是,例如,如果我有一个成员、一个静态变量和一个名为“robot”的局部变量,那么在编写方法时引用它不是很麻烦吗?这也许是一个不切实际的例子,但我喜欢在脑海中有一个好的规则集,我可以始终如一地应用它,即使是在不切实际的情况下也是如此。

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

我想我会制作一个优点/缺点列表,并在我了解更多时对其进行编辑。

反对匈牙利语的论据:

Class.RobotRobot

this.robot

机器人

不需要匈牙利语。

计数器:

还有一个不一致的地方,Robot在不同的方法中可能意味着不同的东西。为了保持一致,您应该在每个 Robot 变量前加上 Class 或 this(或什么都不加)。

除此之外,假设您想访问静态变量 Strawberry,您怎么知道名为 Strawberry 的成员变量未定义?也许它是在另一个您看不到的文件中定义的,因此您可能会得到意想不到的结果。现在您可能会说这通过 IDE 是可见的,但我认为使用前缀更好,因为您可以看到您正在引用的内容,而您可能会错过 IDE 告诉您的内容。当然,您也可以使用 this/Classname 前缀,但这违背了不使用匈牙利符号的目的。

反对匈牙利语的论据:

当在字段和变量的命名中使用匈牙利表示法时,就会违反此规则。匈牙利符号的使用在 C++ 代码中已经很普遍,但 C# 的趋势是使用更长、更具描述性的变量名称,这些名称不是基于变量的类型,而是描述变量的用途。

计数器:

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

反对匈牙利语的论据:

现代代码编辑器(如 Visual Studio)可以轻松识别变量或字段的类型信息,通常只需将鼠标光标悬停在变量名称上即可。这减少了对匈牙利符号的需求。

计数器:

虽然这是事实,但我本人几乎从不将鼠标悬停在变量名称上方,除非发生错误。相比之下,使用匈牙利表示法,您可以立即看到您的变量在类中的位置。

备注:

Microsoft 不建议对文件名使用匈牙利表示法吗?我读到在接口(interface)文件前加上 I 是一种惯例,这是匈牙利符号的一种形式。虽然这与我上面的问题没有直接关系,但它确实提出了有时建议使用匈牙利表示法的观点。

最佳答案

不,不要这样做。它使代码更难阅读。如果你写英语时每个动词前面都有一个 v_,每个名词前面都有 n_,这会使句子更难阅读,同时添加大多数时候没有用的信息。

如果您的类设计得很好,职责很少,方法也很短,那么从名称和使用它的上下文中找出每个变量的含义应该不会太困难。当它不明显而您需要知道时,很容易找到:您只需将鼠标悬停在变量名称上,或按“Go To Definition”。

StyleCop 有一个 rule当您使用匈牙利表示法时会发出警告。规则描述有一些关于为什么存在该规则的解释:


  • TypeName FieldNamesMustNotUseHungarianNotation
  • CheckId SA1305
  • 类别命名规则

原因

C# 中字段或变量的名称使用匈牙利表示法。

规则说明

当在字段和变量的命名中使用匈牙利表示法时,就会违反此规则。匈牙利符号的使用在 C++ 代码中已经很普遍,但 C# 的趋势是使用更长、更具描述性的变量名称,这些名称不是基于变量的类型,而是描述变量的用途。

此外,现代代码编辑器(如 Visual Studio)可以轻松识别变量或字段的类型信息,通常只需将鼠标光标悬停在变量名称上即可。这减少了对匈牙利符号的需求。

关于c# - 我应该在 C# 中使用匈牙利应用程序符号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8334548/

相关文章:

android - 关于变量名的有趣细节

c# - Mono 上的 WinForms/Console 应用程序,如何知道它以 root 身份运行

c# - 错误 : *. csproj 无法在 MonoDevelop 上导入 "$(MSBuildBinPath)\Microsoft.CSharp.targets"

variables - 您是否遵循原始程序员的命名约定?

apache-flex - 用于 ActionScript (Flex) 的 Checkstyle

iphone - 在 Objective C 中使用下划线作为属性名称前缀

perl - 匈牙利符号是否适用于 Perl?

javascript - 如何使用 HTML AGILITY PACK 调用 Click

c# - 如何在 C# 中将 IFormFile 转换为 byte[]?

vba - 面向对象风格 - 在哪里定义属性?编程语言