什么`m_`可变的前缀是什么意思?

我经常在教程,例子和其他主要与游戏开发有关的代码中看到用于variablesm_Worldm_Sprites ,…)的m_前缀

为什么人们会在variables中添加前缀m_

这是定义成员variablesvariables的典型编程习惯。 所以当你稍后使用它们时,你不需要看到它们被定义的位置来知道它们的范围。 如果您已经知道范围,并且您正在使用诸如intelliSense之类的东西 ,那么这也很棒,您可以从m_开始,并显示所有成员variables的列表。 匈牙利符号的一部分,请参阅示例中关于范围的部分。

Clean Code:敏捷软件工匠手册中,有一个关于这个前缀用法的明确build议:

你也不需要用m_前缀成员variables。 你的课程和function应该足够小,你不需要它们。

还有一个例子(C#代码):

不好的做法:

 public class Part { private String m_dsc; // The textual description void SetName(string name) { m_dsc = name; } } 

良好的做法:

 public class Part { private String description; void SetDescription(string description) { this.description = description; } } 

我们用语言结构来指代在明确歧义的情况下( description成员和description参数)的成员variables: this

m_前缀通常用于成员variables – 我认为它的主要优点是它有助于在公共属性和支持它的私有成员variables之间创build明确的区别:

 int m_something public int Something { get { return this.m_something; } } 

它可以帮助支持variables的一致命名约定,而m_前缀是这样做的一种方式 – 一种在不区分大小写的语言中起作用的方法。

这是多么有用取决于您使用的语言和工具。 具有强大的重构工具和智能感知的现代IDE对这样的约定的需求较less,当然不是这样做的唯一方式,但无论如何值得注意实践。

这在C ++中是很常见的做法。 这是因为在C ++中,成员函数和成员variables的名称不能相同,getter函数通常不带“get”前缀。

 class Person { public: std::string name() const; private: std::string name; // This would lead to a compilation error. std::string m_name; // OK. }; 

 main.cpp:9:19: error: duplicate member 'name' std::string name; ^ main.cpp:6:19: note: previous declaration is here std::string name() const; ^ 1 error generated. 

http://coliru.stacked-crooked.com/a/f38e7dbb047687ad

“m_”表示“成员”。 前缀“_”也很常见。

您不应该在使用不同的惯例/语法来解决这个问题的编程语言中使用它。

正如在其他答案中所述, m_前缀用于表示variables是一个类成员。 这与匈牙利符号不同,因为它不表示variables的types,而是表示它的上下文。

我在C ++中使用m_ ,但在其他语言中使用“this”或“self”是强制的。 我不喜欢看到C ++使用“this->”,因为它混淆了代码。

另一个回答说, m_dsc是“坏习惯”和“描述” 是“好习惯”,但这是一个红鲱鱼,因为问题是有缩写。

另一个答案是,inputthispopupIntelliSense,但任何好的IDE都会有一个热键来为当前class级成员popupIntelliSense。

正如许多其他答复中所述,m_是表示成员variables的前缀。 它在C ++世界中被广泛使用,并被传播到其他语言,包括Java。

在一个现代的IDE中,它是完全多余的,因为语法突出显示哪些variables是本地的 ,哪些是成员 。 然而,到90年代末期出现语法高亮的时候,这个惯例已经存在了很多年了,并且已经稳固下来了(至less在C ++世界里)。

我不知道你指的是哪个教程,但是我会猜测他们使用的约定是由于以下两个因素之一:

  • 他们是C ++教程,由习惯于m_约定的人编写,和/或…
  • 他们用普通的(等宽的)文本编写代码,没有语法高亮,因此m_约定对于使示例更清晰有用。
Interesting Posts