Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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中的匈牙利符号# 使用C语言之前,C++是我的主要编程语言。匈牙利符号深深地印在我的心里_C#_Naming Conventions - Fatal编程技术网

C# C中的匈牙利符号# 使用C语言之前,C++是我的主要编程语言。匈牙利符号深深地印在我的心里

C# C中的匈牙利符号# 使用C语言之前,C++是我的主要编程语言。匈牙利符号深深地印在我的心里,c#,naming-conventions,C#,Naming Conventions,我用C语言做了一些小项目,没有读C语言书或其他语言指南。在那些小型的c#项目中,我使用了类似 private string m_strExePath; 直到我读到一篇文章,上面写着: 不要使用匈牙利符号 那为什么呢?我是唯一一个在我的C代码中有m_strExePath或m_iNumber的人吗?不,你不是唯一一个这样做的人。人们普遍认为匈牙利符号并不是用C#命名事物的最佳方式(IDE处理了许多匈牙利符号试图解决的问题)。如果匈牙利符号深植于您、您的团队和您的公司的心中,请务必使用它。就我从博客

我用C语言做了一些小项目,没有读C语言书或其他语言指南。在那些小型的c#项目中,我使用了类似

private string m_strExePath;
直到我读到一篇文章,上面写着:

不要使用匈牙利符号


那为什么呢?我是唯一一个在我的C代码中有m_strExePath或m_iNumber的人吗?

不,你不是唯一一个这样做的人。人们普遍认为匈牙利符号并不是用C#命名事物的最佳方式(IDE处理了许多匈牙利符号试图解决的问题)。

如果匈牙利符号深植于您、您的团队和您的公司的心中,请务必使用它。就我从博客和书籍中所读到的内容而言,它不再被认为是最佳实践。

如果你将指针放在VS中的变量上,它将告诉你它是什么类型的变量,因此没有理由使用这些神秘的变量名,尤其是来自其他语言的人可能需要维护代码,这将成为易于阅读的障碍。

你不是唯一的人,但我认为这是相对少见的。就我个人而言,我不喜欢匈牙利符号,至少从简单意义上讲,我不喜欢匈牙利符号,因为它只是重申声明中已经存在的类型信息。(匈牙利符号“真”的粉丝们会解释这一区别——我从来没有这么担心过,但我能理解他们的观点。如果你使用一个通用前缀,比如长度单位和重量单位,你不会意外地给长度变量赋值,即使两者都可能是整数。)


然而,对于私人成员,你几乎可以做你想做的事情——与你的团队商定命名约定应该是什么。重要的一点是,如果您希望您的API与.NET的其余部分相适应,请不要在公共成员(包括参数)中使用匈牙利符号。

在进行用户界面设计时,我发现维护匈牙利符号非常有用。文本框、标签和下拉列表等项更易于快速理解,并且经常会出现重复的控件名称:

lblTitle = Label
txtTitle = TextBox
ddlTitle = DropDownList
对我来说,这更容易阅读和分析。否则,由于IDE的进步,尤其是VisualStudio,匈牙利符号就不适合了


而且,Joel on Software有一篇与匈牙利符号相关的优秀文章,标题为:这篇文章为匈牙利符号提供了一些很好的论据。

除非您使用的是文本编辑器而不是VS IDE,否则匈牙利符号几乎没有什么价值,它不仅没有提高可读性,反而会增加匈牙利符号的一个缺点注释是指开发人员在早期编码过程中经常更改变量的类型,这要求变量的名称也要更改。

目前我只看到两个匈牙利注释形式:

  • 类成员变量,带前导下划线(例如
    \u someVar
  • WinForms和WebForms控件名称(
    btn
    用于按钮,
    lbl
    用于标签等)

成员变量上的主要下划线似乎会在这里停留一段时间,但我预计匈牙利语在控件名称上的流行程度会逐渐减弱。

Joel Spolsky在这一主题上有很好的表现。简要总结一下,在实践中使用了两种匈牙利符号

第一种是“Systems Hungarian”,其中使用前缀指定变量类型。比如字符串的“str”。这几乎是无用的信息,特别是因为现代IDE会告诉您类型

第二个是“Apps Hungarian”,其中您可以使用前缀指定变量的用途。最常见的例子是使用“m_3;”表示成员变量。如果操作正确,这将非常有用

我的建议是避免像瘟疫一样使用“匈牙利系统”,但在有意义的地方一定要使用“匈牙利应用”。我建议读乔尔的文章。这有点啰嗦,但解释得比我好得多


这篇文章最有趣的部分是匈牙利符号的原始发明者查尔斯·西蒙尼(Charles Simonyi)创造了“Apps Hungarian”,但他的论文被严重曲解,因此产生了对“Systems Hungarian”的厌恶。

你当然不是唯一的人,但我希望你是下降趋势的一部分:)

匈牙利符号的问题在于它试图通过命名约定实现类型系统。这是非常有问题的,因为它是一个只有人工验证的类型系统。项目中的每个人都必须同意相同的标准集,进行严格的代码审查,并确保为所有新类型分配适当和正确的前缀。简而言之,要保证与足够大的代码库的一致性是不可能的。在这一点上没有一致性,你为什么要这样做

此外,工具不支持匈牙利符号。这似乎是一个愚蠢的评论表面,但考虑重构例如。匈牙利命名约定系统中的每次重构都必须伴随大量重命名,以确保保留前缀。大规模重命名容易受到各种细微错误的影响


与其使用名称来实现类型系统,不如依赖类型系统。它具有自动验证和工具支持。较新的IDE使发现变量类型(intellisense、悬停提示等)变得更加容易,并且真正消除了最初对匈牙利符号的渴望

在任何语言中,匈牙利符号都是一个可怕的错误。你也不应该在C++中使用它。命名变量,以便知道它们的用途。不要将它们命名为重复的类型信息,IDE可以提供这些信息,这些信息可能会改变(而且通常是不相关的)
public string ExecutablePath { ... }
public string ExecutablePath { get; set; }
private string mPathExe;
private string msgNotFound;
public void PrintNames (string fName, string lName)
{
    lblFullName.Text=fName + " " + lName;
}