代码之家  ›  专栏  ›  技术社区  ›  Hemant

如何命名构造函数参数和成员变量?

  •  7
  • Hemant  · 技术社区  · 15 年前

    我在命名类的内部变量时不使用前缀(我知道有些人使用前缀,但我不是在开始“为什么要…”的辩论)。我只是喜欢那样。问题是,有时在constructor中传递相同的参数,结果我弄不清楚如何命名它们。例如:

    public class SampleClass
    {
        private int classId;
        private string className;
    
        public SampleClass (int XclassIdX, string XclassNameX) {
            classId = XclassIdX;
            className = XclassNameX;
        }
    }
    

    如何命名XclassIdX和XclassNameX?

    可能可以做的一件事是:

    public class SampleClass
    {
        private int classId;
        private string className;
    
        public SampleClass (int classId, string className) {
            this.classId = classId;
            this.className = className;
        }
    }
    

    只是不确定这是一个好主意还是有其他更优雅的方式?

    8 回复  |  直到 9 年前
        1
  •  19
  •   John Feminella    15 年前

    我认为您正在描述的解决方案,其中构造函数参数的名称相同,并且您在类成员前面加上前缀 this

        2
  •  5
  •   Marc Gravell    15 年前

    我只是简单地使用 this 方法然后,我所有的变量和字段都反映了它们的意图。不要这样做 X 事情-那只是丑陋-P

        3
  •  3
  •   Eric Petroelje    15 年前

        4
  •  2
  •   Triynko    15 年前

    简短答复:

    成员 参数 有“ m_ “和” p_ “,或” s_ “如果成员是静态的。

    不要装饰 ,当您觉得必须将它们命名为相同的名称(忽略大小写)时,请通过在属性前面加上“this”来解决冲突。

    说明:

    考虑到至少有四(4)个不同类别的可读/可分配的名称需要区分: 局部变量 , ,和方法 参数 . 所有四个类别都可能出现在一个代码块中,因此它们都需要明确的区别特征。

    有意义的前缀可以同时区分变量 揭示它们的作用域,如m_u(member)、s_u(static)、p_u(parameter),使公共属性和局部变量保持简单,无需前缀,也无需担心大小写敏感性。如果出于某种原因,您必须在不考虑大小写的情况下将本地名称命名为与属性相同的名称,那么只需在属性前面加上“this”

    局部变量 参数 不发生,因为它们不能被命名为相同的东西(编译器将捕获重复的定义)。同样的道理也适用于 . 分别以“p_”和“m_”前缀的参数和成员不会冲突,无前缀局部变量和属性之间的冲突可以通过在属性中添加“this.”来解决。

    我的建议的替代方案并不漂亮:区分大小写(不好的主意,因为并非所有CLR语言都区分大小写),自己使用下划线(也不好,因为它可能会与标准冲突,不会告诉你一件该死的事情),或者使用不同的名称(可能很耗时、很难,而且看起来很随意)。

        5
  •  0
  •   Matthew Dresser    15 年前

    为什么不为私有成员变量添加下划线或单字母前缀呢。 如果您不喜欢这个想法,那么您在第二个代码块中所做的就可以了。

        6
  •  0
  •   Jakob Christensen    15 年前

    像那样在参数上加X是不好的。构造函数是类的公共接口的一部分,它只会混淆类的用户。有些人喜欢在成员变量前面加下划线,这样更好,因为只有类的实现者才能看到。否则,在第二个示例中使用这个就足够了。

        7
  •  0
  •   peterchen    15 年前

    m_foo
    Foo 公共财产
    foo 用于参数和局部变量。

    我更喜欢区分块范围和扩展范围成员,这就是我坚持使用前缀的原因。

        8
  •  -1
  •   LegendLength    15 年前

    我还觉得“this.”实际上更糟糕,因为在极端情况下(即大型方法),可能会忽略“this.”,引用错误的变量。我知道大型方法是不好的,但它们确实会自然地出现在具有不同技能的开发人员的实际业务应用程序中。为私有字段使用前缀将防止出现这种情况。

    人们很容易辩称,下划线可能会像“this”一样被遗忘。但这是不正确的,因为下划线更改了变量的名称,所以唯一可能忘记它的地方是定义,而不是文件中的用法。而使用“this.”前缀时,若您在使用过程中忘记了它,则不会出现编译器错误。