什么`m_`可变的前缀是什么意思?
我经常在教程,例子和其他主要与游戏开发有关的代码中看到用于variables ( m_World
, m_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.
“m_”表示“成员”。 前缀“_”也很常见。
您不应该在使用不同的惯例/语法来解决这个问题的编程语言中使用它。
正如在其他答案中所述, m_
前缀用于表示variables是一个类成员。 这与匈牙利符号不同,因为它不表示variables的types,而是表示它的上下文。
我在C ++中使用m_
,但在其他语言中使用“this”或“self”是强制的。 我不喜欢看到C ++使用“this->”,因为它混淆了代码。
另一个回答说, m_dsc
是“坏习惯”和“描述” 是“好习惯”,但这是一个红鲱鱼,因为问题是有缩写。
另一个答案是,inputthis
popupIntelliSense,但任何好的IDE都会有一个热键来为当前class级成员popupIntelliSense。
正如许多其他答复中所述,m_是表示成员variables的前缀。 它在C ++世界中被广泛使用,并被传播到其他语言,包括Java。
在一个现代的IDE中,它是完全多余的,因为语法突出显示哪些variables是本地的 ,哪些是成员 。 然而,到90年代末期出现语法高亮的时候,这个惯例已经存在了很多年了,并且已经稳固下来了(至less在C ++世界里)。
我不知道你指的是哪个教程,但是我会猜测他们使用的约定是由于以下两个因素之一:
- 他们是C ++教程,由习惯于m_约定的人编写,和/或…
- 他们用普通的(等宽的)文本编写代码,没有语法高亮,因此m_约定对于使示例更清晰有用。