`m_`变量前缀是什么意思?

kra*_*mir 132 hungarian-notation

我经常在教程,示例和其他主要与游戏开发相关的代码中看到m_用于变量(m_World,m_Sprites...)的前缀.

为什么人们m_为变量添加前缀?

Mic*_*use 96

这是用于定义作为成员变量的变量的典型编程实践.因此,当您以后使用它们时,您不需要查看它们的定义位置以了解它们的范围.如果您已经知道范围并且使用诸如intelliSense之类的东西,那么这也很棒,您可以从这里开始,m_并显示所有成员变量的列表.匈牙利表示法的一部分,请参阅此处示例中有关范围的部分.

  • 我更喜欢使用"this->" - 有点使"m_"冗余并且更好,因为它是由编译器强制执行的(理论上你可以在任何变量类型上弹出"m_";不能用"this->" ").我的一部分希望C++能够将"this->"标准化为强制性.但这更像是一个讨论世界,而不是一个答案. (46认同)
  • 对于命名约定的最糟糕的论点,你可以简单地按ctrl + space来进行智能感知. (42认同)
  • 值得一提的是,还有很多其他或多或少的标准方法可以做同样的事情; "m_variable","m_Variable","mVariable","_ variable","_ Variable"......哪种方式是"最好的"或"正确的"(或者是否完全按照这种方式)是一种有争议且毫无结果的争论空格与标签'.:) (11认同)
  • @nightcracker eventHough我不喜欢这个前缀,他的意思是当你输入m_然后"CTRL + SPACE"(除非它是自动的)你会得到一个只包含你的成员的列表.这不是一个很好的理由,但它是一个加号. (10认同)
  • @LaurentCouvidou,你不能真正强制devs创建前缀为`m_`的成员变量. (3认同)
  • @nightcracker [不确定](http://images.wikia.com/en.futurama/images/d/da/Fry_Looking_Squint.jpg)如果想要有趣或只是天真.*intellisense之前有一段时间*仍然有很多人不使用它.我**不是**说intellisense是使用这个命名约定的原因.我说如果你正好使用intellisense,这是一个额外的加分.命名约定是为了使代码更清晰并保持标准. (2认同)
  • @SomeWritesReserved对。在C ++中复查`m_`前缀会更容易一些,因为所有成员或多或少都在标头的同一位置声明。另一方面,对于“ this->”,我想说它更有可能让一些非前缀的实例进入方法主体。但是,是的,如果人们决定不想遵循这种约定,或者只是不注意,那么无论如何,您都会为这两种解决方案所困扰。 (2认同)
  • 人们可能应该记住,这个约定早在智能感知之前就已经存在,并不是每个人都使用 Visual Studio... (2认同)

Inf*_*ero 77

清洁代码:敏捷软件工艺手册中,有一个关于此前缀用法的明确建议:

您也不需要为成员变量添加前缀m_.您的类和函数应该足够小,以至于您不需要它们.

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

不好的做法:

public class Part
{
    private String m_dsc; // The textual description

    void SetName(string name)
    {
        m_dsc = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

好的做法:

public class Part
{
    private String description;

    void SetDescription(string description)
    {
        this.description = description;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们用语言结构计数指成员变量中明确歧义(的情况下,即,description成员和description参数)this.

  • 措辞可能是"有明确的建议反对使用此前缀:" (6认同)
  • Microsoft 建议使用前缀“_”:_在命名私有或内部字段时使用驼峰式大小写,并在其前面添加 _ ._ 请参阅[此链接](https://learn.microsoft.com/en-us/dotnet/csharp /fundamentals/coding-style/coding-conventions) (“在支持语句完成的 IDE 中编辑遵循这些命名约定的 C# 代码时,键入 _ 将显示所有对象范围的成员。”) (4认同)
  • 我很高兴有人写了它 (2认同)
  • 对于 C# 来说,这是一个非常糟糕的建议。能够区分局部变量(myVar)和私有字段(_myVar)有很大帮助。对于所有其他涉及数据类型的事情,IDE 都会为您提供帮助,这使得饥饿表示法在 C# 中变得过时。 (2认同)

doc*_*doc 14

这是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.
};
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)

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

"m_"表示"成员".前缀"_"也很常见.

您不应该在使用不同约定/语法解决此问题的编程语言中使用它.


Kei*_*ith 11

m_前缀通常用于成员变量-我认为它的主要优点是,它有助于一个公共财产和私有成员变量后盾它之间建立一个明显的区别:

int m_something

public int Something => this.m_something; 
Run Code Online (Sandbox Code Playgroud)

它可以帮助为支持变量提供一致的命名约定,m_前缀是这样做的一种方式 - 一种在不区分大小写的语言中工作的方法.

这有多大取决于您使用的语言和工具.具有强大的重构工具和智能感知的现代IDE对此类惯例的需求较少,而且肯定不是这样做的唯一方法,但在任何情况下都值得了解这种做法.

  • 如果你必须用你的语言写"这个",那么`m_`真的没用. (5认同)
  • 为什么不,`this.Something` 用于财产,`this.something` 用于支持?或者`this._something`作为后盾?`this.m_something` 是多余的。我使用 `_something` 以便在我输入 `Something` 时不会不小心输入它,与会员资格与否无关 (2认同)

jiv*_*key 9

洛克希德马丁公司使用了一种非常适合使用的 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
Run Code Online (Sandbox Code Playgroud)

所以...

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*
}
Run Code Online (Sandbox Code Playgroud)

物有所值。

  • 惊人的。感谢您的“例子”。当您编辑 200,000 行代码时,它才真正派上用场。 (3认同)
  • 并没有表现出防守的意思。对不起。 (2认同)
  • 这是匈牙利表示法的变体,在现代语言中没有意义...... (2认同)

Que*_*n 2 7

如其他答案中所述,m_前缀用于表示变量是类成员.这与匈牙利表示法不同,因为它不表示变量的类型,而是表示其上下文.

m_在C++中使用但在其他语言中没有使用'this'或'self'是强制性的.我不喜欢看到'this->'与C++一起使用,因为它使代码混乱.

另一个答案m_dsc是"不良做法"和"描述"; 是"良好的做法",但这是一个红色的鲱鱼,因为那里的问题是缩写.

另一个答案是输入this弹出智能感知器,但任何好的IDE都会有一个热键来为当前的类成员弹出IntelliSense.