【问题标题】:Common practice for variables with similar names in constructor parameter and as a property在构造函数参数和作为属性中具有相似名称的变量的常见做法
【发布时间】:2013-05-28 20:20:51
【问题描述】:

在构造函数中将变量传递给属性时,是否有一种“正确”的方式来命名变量?示例(在 c# 中):

public class MyClass
{
    private int index;

    public MyClass(int i)
    {
        index = i;
    }
}

当两个变量“相同”时,是否可以更简洁地命名一个等等?我想至少保持一致,但我想知道是否有一种可接受的方式来做到这一点。

【问题讨论】:

    标签: c# class variables parameters constructor


    【解决方案1】:
    public MyClass(int index)
    {
        this.index = index;
    }
    

    这至少是 Java 中常见的做法,我猜是the same in C#。它使名称比i更有意义,并使用与属性相同的名称来指定相同的东西。

    【讨论】:

    • C#中常用的方式是将变量命名为小写,将属性命名为大写。这样你就可以简单地写Index = index;
    【解决方案2】:

    Refactor 建议类的私有字段为驼峰式,并以 _ 为前缀(在您的情况下为 _index)。他们建议参数为不带下划线的 camelCase。

    如 cmets 中所述,对于私有字段没有 MSDN 推荐的标准。

    【讨论】:

    • 谁推荐的?据我所知,不是微软,也不是 StackOverflow 用户。
    • 重构。微软没有推荐。说了这么多,还是挺有道理的。
    • 这当然是一个明智的命名方案,我同意,但不是唯一的,并且没有使用到我称之为“推荐标准”的程度。
    • 已编辑以反映推荐来源。
    【解决方案3】:

    你可以照你写的使用

    如果变量名称相同,下面可以是另一个选项

    public class MyClass
    {
        private int index;
    
        public MyClass(int index)
        {
            this.index = index;
        }
    }
    

    【讨论】:

      【解决方案4】:

      您可以将它们命名为相同的名称。用它来澄清你在做什么。

      this.index = index;
      

      如果您进行区分(我不建议这样做),最好明确传递给方法的参数名称而不是您的内部名称。如果其他程序员使用您的类,那么至少他们知道参数的含义。所以如果你想区分:

      public MyClass(int index)
      {
        i = index;
      }
      

      【讨论】:

        【解决方案5】:

        我认为您应该专注于使“可见”变量更具可读性(在这种情况下,这是构造函数的参数)。毕竟,这是您班级的用户在输入时会看到的内容。

        是的,有一个正确的方法可以避免这种困境,即遵循为您的语言建立的命名约定。例如,在 C# 中,私有字段以下划线开头是一种约定。可能有与 Java 等价的东西。

        话虽如此,通过显式使用this 来引用字段(当存在命名模糊时这种做法是合适的),绝对可以区分字段和局部变量。

        【讨论】:

          【解决方案6】:

          在 MSDN 中定义了 .NET 中的一组编码标准。

          http://msdn.microsoft.com/en-us/library/ms229002.aspx

          但对于指南的全部列表:

          http://msdn.microsoft.com/en-us/library/ms229042.aspx

          【讨论】:

            【解决方案7】:

            C# 标准会这样编写您的代码:

            public class MyClass {
              public MyClass(int index) {
                Index = index;
              }
              public int Index {
                get { return _index; }
                private set { _idex = value; /* Perform other actions triggered by the set */ }
              }
              private int _index;
            }
            

            在不需要支持字段的情况下,属性(和支持字段)可以并且应该简化为:

            public Index { get; private set; }
            

            【讨论】:

            • 你好,我知道那是旧的,但为什么不 _index = index in constructor
            • @damsan: 因为在这种情况下代码/* Perform other actions triggered by the set */ 不会被执行。这是一个缺陷。
            猜你喜欢
            • 1970-01-01
            • 2012-10-04
            • 1970-01-01
            • 1970-01-01
            • 2015-09-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多