【问题标题】:Why do we use _ in variable names?为什么我们在变量名中使用 _?
【发布时间】:2011-10-17 16:43:40
【问题描述】:

我见过像 _ image 这样的变量,想知道 _ 是什么意思?

【问题讨论】:

  • 我不确定其他语言,但在 C# 中,_naming 是遗留的东西(由于旧系统/框架的限制和损坏的东西)。请不要再说这是一个公约,它不是。这是一个谎言,是人们编写丑陋代码的借口。 (它可能有一些用例,但很少,所以请不要这样做。)另外,别再撒谎了,这是一种惯例或事情。

标签: programming-languages naming-conventions


【解决方案1】:

有些人用它来表示它们变量而不是(比如说)方法名称。或者说它们是实例变量而不是局部变量。有时您会看到额外的前缀,例如

private int m_age; // Member (instance) variable
private static int g_maxAge; // Global (static) variable

这只是一个约定。我打算说“_ 没有什么神奇之处”,但这并不完全正确 - 在某些语言中, 下划线保留用于“特殊”用途。 (具体用法当然取决于语言。)

编辑:适用于 C# 的双下划线规则示例。来自 C# 4 规范,第 2.4.2 节:

包含两个连续下划线字符 (U+005F) 的标识符保留供实现使用。例如,一个实现可能会提供以两个下划线开头的扩展关键字。

【讨论】:

  • “某些语言”是指 Python,对吗?还是有其他语言也可以做到这一点?
  • @Davy8:实际上我在考虑 C、C++ 和 C#。 (我不确定前两个,但我相当有信心。我确定 C#。)
  • 在 C 和 C++ 中,还保留一个前导下划线 + 大写字母。不鼓励在用户代码中使用前导下划线。 (一般来说,不鼓励使用两个相同的名称,但下划线除外,因为这两者很容易混淆。)
【解决方案2】:

变量名中的下划线是完全可选的。许多程序员使用它来区分私有变量——因此实例变量通常会在名称前加上下划线。这可以防止与局部变量混淆。

【讨论】:

    【解决方案3】:

    在大多数语言中,它实际上并不影响代码的功能,但通常用于表示保留名称或内部名称。

    在某些语言中,通常将实例变量命名为 _imageimage_,然后将用于访问它的公共方法设为 image()

    类似地,某些语言中使用__FILE__ 等名称来表示由解释器或编译器创建的特殊变量或常量;这些名称通常保留,以鼓励程序员避免在自己的程序中使用这些名称,以防将来的语言版本中使用这些名称。

    【讨论】:

      【解决方案4】:

      通常它将类字段与变量分开。避免在代码构造中使用this

      class MyClass {
      
       private int _myIntField;
      
      
          private void setMyIntField(int value2Set) {
           _myIntField = value2Set;
          }
      
      }
      

      【讨论】:

      • 不,它不需要 this 。知道它是私有变量。这是将遗留的东西带入 C#,但现代 dot Net 并没有强制执行,也不需要这些废话。这是遗留问题,它是人们编写丑陋代码但没有充分理由的另一种方式。 (在某些情况下它可能有用,但很少有用,请停止使用。)请原谅后代的年轻程序员。
      【解决方案5】:

      它不意味着任何东西。将私有成员变量与方法和公共属性分开是一种通用的命名约定。例如:

      class Foo
      {
         private int _counter;
      
         public int GetCounter()
         {
            return _counter;
         }
      
         public int SetCounter(int counter)
         {
            _counter = counter;
         }
      }
      

      【讨论】:

      • 不,这不是惯例。在 C# 中,_ 变量样式是一个遗留的东西(不完全记得它来自哪里,一些旧的参考书确实提到了。) 它甚至在像 _abc.cshtml 这样的视图中使用,但是问题是,旧的框架/系统存在一些问题,现在较新的 dot Net 不需要任何像这样愚蠢的东西,它是从遗留的损坏的东西中提出来的。 _variable 的唯一用例是当您想要避免 C# get set 访问器与您的私有成员之间的名称冲突时。但是,除非您的 get set 访问器具有验证逻辑,否则您很少使用它。
      【解决方案6】:

      在大多数语言中,_ 是除了字母和数字之外的变量名中唯一允许的字符。以下是一些常见的用例:

      • 分隔词:some_variable
      • 私有变量以下划线开头:_private
      • 在末尾添加以区分内置名称:filter_(因为filter 是内置函数)
      • 在循环期间本身作为未使用的变量:[0 for _ in range(n)]

      请注意,有些人真的不喜欢最后一个用例。

      【讨论】:

      • 我见过很多_varname 表示私有变量的例子。
      【解决方案7】:

      不鼓励以变量名开头的下划线字符(_),但它是合法的,有些人用它来标识私有变量,有些人用它来命名缓存变量。也通过这个link

      【讨论】:

        【解决方案8】:

        _ 通常表示私人或内部的东西。在 C++ 标准库中,所有实现特定的变量都必须以 _ 开头。

        【讨论】:

          【解决方案9】:

          另一个用例(主要在 javascript 中)是当您需要将当前实例 this 分配给我们编写如下的局部变量时

          var _this = this;
          

          如果需要创建本地临时对象引用,为了区分实际需要的引用,我们创建如下

          List<Employee> employeeList = new ArrayList<>();
          for (Employee _employee : employeeList) {}
          

          因此,如果我们遵循此最佳实践,每次您看到带有 _ 的变量时,我们都会得出结论,即它被用于以该特定方法解决某些业务需求。

          【讨论】:

            【解决方案10】:

            要避免保留关键字,或者在保留关键字中,使它们更容易避免。 在 JavaSE9 中不鼓励和保留单个下划线。

            【讨论】:

              【解决方案11】:

              基本上它告诉开发人员应该提供定义。总之它定义它没有任何定义。

              【讨论】:

                【解决方案12】:

                根据 ANSI-C 标准,在标识符中使用两个下划线 (`__') 仅供编译器内部使用。

                下划线 (`_') 常用于库函数的名称中(例如“_main”和“_exit”)。为避免冲突,请勿使用下划线开头的标识符。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-04-15
                  • 2015-06-22
                  • 2020-08-19
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多