我经常在教程,示例和其他主要与游戏开发相关的代码中看到m_
用于变量(m_World
,,m_Sprites
...)的前缀。
人们为什么要m_
在变量前添加前缀?
m_
用途,但是这里有一半的回答是关于为什么每个人都认为他们目前最喜欢的是最好的评论。
我经常在教程,示例和其他主要与游戏开发相关的代码中看到m_
用于变量(m_World
,,m_Sprites
...)的前缀。
人们为什么要m_
在变量前添加前缀?
m_
用途,但是这里有一半的回答是关于为什么每个人都认为他们目前最喜欢的是最好的评论。
Answers:
这是用于定义作为成员变量的变量的典型编程实践。因此,以后使用它们时,无需查看定义它们的位置即可知道它们的范围。如果您已经知道范围,并且正在使用intelliSense之类的东西,那么这也很好,您可以从开始m_
并显示所有成员变量的列表。匈牙利表示法的一部分,请参见此处的示例中有关范围的部分。
m_
任何一个为前缀的成员变量。
在“ 干净代码:敏捷软件技巧手册”中,明确建议不要使用此前缀:
您也不需要再为成员变量加上前缀
m_
。您的类和函数应该足够小,以至于不需要它们。
还有一个这样的示例(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
参数)this
。
这是C ++中的常见做法。这是因为在C ++中,成员函数和成员变量不能具有相同的名称,并且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_
前缀通常用于成员变量-我认为它的主要优点是,它有助于在公共属性和支持它的私有成员变量之间建立清晰的区分:
int m_something
public int Something => this.m_something;
对于后备变量,有一个一致的命名约定可能会有所帮助,而m_
前缀是一种做到这一点的方法-一种不区分大小写的语言。
这有多有用,取决于您使用的语言和工具。具有强大的重构工具和智能感知功能的现代IDE对这样的约定的需求减少了,这当然不是唯一的方法,但是在任何情况下都值得一提。
this.
用自己的语言写,那m_
真的没用。
m_
是将其与它所支持的属性区分开的-因此this.Something
对于属性与this.m_something
后备成员。这不是我更喜欢的约定,但是我最经常看到的是它在不区分大小写的语言(例如VB)中使用。
this.Something
为了财产和this.something
支持?还是this._something
为了支持?this.m_something
是多余的。我_something
这样做是为了确保我输入Something
_
仅靠前缀就可以完成任务,但这m_
是惯例。这不是我个人使用的语言,但是如果您在代码中看到它,那是作者的意图。
如其他答案所述,m_
前缀用于指示变量是类成员。这与匈牙利表示法不同,因为它不指示变量的类型,而是指示其上下文。
我m_
在C ++中使用,但在某些其他必须使用“ this”或“ self”的语言中却没有使用。我不喜欢C ++使用'this->',因为它会使代码混乱。
另一个答案m_dsc
是“不良做法”和“描述”;是“好的做法”,但这是一条鲱鱼,因为这里存在缩写的问题。
另一个答案是,键入会this
弹出IntelliSense,但是任何不错的IDE都会有一个热键为当前班级成员弹出IntelliSense。
m_description
VS description
。
如许多其他响应所述,m_是表示成员变量的前缀。它曾经/曾经在C ++世界中使用,并且也传播到其他语言,包括Java。
在现代IDE中,它是完全多余的,因为语法高亮显示了哪些变量是局部变量,哪些是成员变量。但是,到90年代后期出现语法高亮时,该约定已经存在了很多年,并且已经确立下来(至少在C ++世界中如此)。
我不知道您指的是哪个教程,但是由于以下两个因素之一,我猜它们正在使用约定:
洛克希德·马丁公司使用3前缀命名方案,这种方案非常好用,特别是在阅读其他人的代码时。
Scope Reference Type(*Case-by-Case) Type
member m pointer p integer n
argument a reference r short n
local l float f
double f
boolean b
所以...
int A::methodCall(float af_Argument1, int* apn_Arg2)
{
lpn_Temp = apn_Arg2;
mpf_Oops = lpn_Temp; // Here I can see I made a mistake, I should not assign an int* to a float*
}
考虑它的价值。
为了完成当前的答案,并且由于问题不是特定于语言的,因此某些C项目使用前缀m_
来定义特定于文件g_
的全局变量-以及作用域大于定义的文件的全局变量。
在这种情况下,用前缀定义的全局变量m_
应定义为static
。
有关使用此约定的项目示例,请参见EDK2(UEFI开源实现)编码约定。