【问题标题】:In C#, what is the generally accepted way to refer to member properties within the class?在 C# 中,普遍接受的在类中引用成员属性的方法是什么?
【发布时间】:2009-01-21 20:48:53
【问题描述】:

已通读MSDN naming guidelines 并找不到明确的答案,除此之外,您通常应尽量避免使用下划线。假设我有以下内容:

public class Employee
{
    private string m_name;  //to store property value called Name

    public string Name
    {
        get { return m_name; }
        set { m_name = value; }
    }

    public void ConvertNameToUpper()
    {
        //by convention should you use this
        return m_name.ToUpper();

        //or this
        return Name.ToUpper(); 
    }
}

上面 m_name 的正确命名约定是什么?例如,在我继承的代码中,我经常看到:

  • m_name
  • _姓名
  • 姓名
  • myName 或其他一些随机标识符

哪一个(或另一个)最常被接受?

作为后续,在类的方法中,您是引用内部(私有)标识符还是公共属性访问器?

【问题讨论】:

  • m 很糟糕,它是从 C++ 继承而来的。它没有增加任何价值。如果您要使用任何内容,请使用下划线。

标签: c# naming-conventions class-design


【解决方案1】:

我认为,无论您使用何种命名约定,最重要的是保持一致。 我的意思是,如果您选择像 _name 一样命名私有成员,那么总是这样做,而不是一次使用 _name,另一次使用 m_name。 我个人使用下划线前缀约定。 (其中一个原因是因为我使用 NHibernate,而 NHibernate 有一个 'field.camelcase-underscore' 访问策略。

对于您的其他问题: 这取决于你想做什么。
您的属性是否包含额外的逻辑,您是否希望在引用它时执行此逻辑?然后使用该属性。你不想执行逻辑?使用该字段。 Eric Lippert 在他的博客上为此写了一封post

对于您的跟进:这一切都取决于具体情况。 如果您的属性包含一些额外的逻辑,并且您不想在从类中访问时执行该额外的逻辑,那么使用支持字段...

【讨论】:

    【解决方案2】:

    首先 - 对于简单的 get/set 情况,我建议您使用自动实现的属性。如果这样做,编译器将生成基础变量,并且您只引用属性本身。

    除此之外,我建议您选择上述之一或任何类似的东西,然后坚持下去。我工作的公司使用 vName,其中“v”表示这是该属性的值。

    【讨论】:

    • 取决于使用的 C# 版本。我认为自动属性仅适用于 C# 3.0+。
    【解决方案3】:

    我使用 Style Cop,它在您的代码中强制执行某些样式。我觉得这非常有用,我的所有团队成员也都在使用它。

    虽然围绕 Style Cop 的使用进行了很多讨论,但我建议的一件事是,如果您使用 Style Cop,那就是启用所有样式。这样,当您在用户之间共享时,事情会变得容易得多。

    这会导致您无法使用下划线命名私有字段。所以我一般在写私有字段的时候用camelCase,公共属性用PascalCase:

    private string name;
    public string Name
    {
        get { return this.name; }
        set { this.name = value; }
    }
    

    Style Cop 还强制使用 this.,这使得事情更容易阅读。

    【讨论】:

    • StyleCop 最初看起来像是在浪费时间——但我们也发现它确实有助于维护。然而,许多规则对我们来说过于严格。建议 using 子句应该在命名空间内的那个......呃!
    • 有些规则很痛苦,但是我们在开始使用它时发现,当我们使用style cop后开始共享代码时,有些人禁用了一些规则,而另一些人则不同的规则。然后我们必须标记代码以符合彼此的设置。不多,但工作量很大。然后我们决定启用所有规则并使用默认设置。到目前为止,它进展顺利,并且有一些很棒的插件也可以自动合规。
    【解决方案4】:

    我在示例代码中看到的最常见的是一个简单的 _ 前缀。

    然而,真正重要的是团队同意标准是什么并坚持下去。

    【讨论】:

      【解决方案5】:

      如果您不能像 Brian Rasmussen 建议的那样使用自动实现的属性,并且您必须拥有一个私有成员,那么我建议使用下划线前缀 _name。

      在智能感知中,项目是参数、本地成员还是私有成员并不是很明显,因为它们都具有相同的符号(蓝色立方体)。但是,如果您将光标移动到特定项目,那么工具提示会告诉您它是哪一个。

      我发现下划线前缀是一种方便的视觉辅助工具,无需移动光标就可以立即看出它是私有成员。

      【讨论】:

        【解决方案6】:

        我曾经非常反对“_”前缀,但它确实对智能感知很有用,当您想要快速访问成员字段而无需键入许多字母时。

        【讨论】:

          【解决方案7】:

          一方面我同意你应该使用公司标准,另一方面我会尽量遵守行业标准。

          【讨论】:

            【解决方案8】:

            我会重复之前的回答,您应该坚持使用您的团队使用的方案,或者如果您不在团队中,请与您使用的任何方案保持一致。

            就我个人而言,我使用下划线前缀,因为我发现它给了我一个很好的视觉提示。

            【讨论】:

              【解决方案9】:

              我认为普遍接受的命名约定只是为了使名称有意义(并且代码简洁明了)。在我看来,如果我的代码中的标识符出于某种原因需要视觉提示,那就太复杂了,而且名称通常并不完全准确。

              我编写的代码需要手册才能阅读...“m”表示类级别,“p”表示参数等。开发命名约定是为了使代码更易于阅读,但它结束了这样做正好相反,因为开发人员运行的暗示是“好的”命名约定意味着可读的代码。

              只要确保丹尼斯·格林(前亚利桑那红衣主教教练)的名言适用于你的身份:“他们就是我们认为的人!”

              【讨论】:

                【解决方案10】:

                我尝试仅在必须时访问成员变量,例如当属性为只读或我想绕过任何设置逻辑时。

                这样做的一个原因是,如果您稍后向 setter 添加逻辑,您很可能希望它在任何地方都可以使用。

                【讨论】:

                  【解决方案11】:

                  对于类级变量,我们的编码标准规定使用 mVariableName 或 m_VariableName。最主要的是跟随你的公司/老师/等。编码标准/实践。

                  我个人只通过它的 getter/setter 访问变量(如果它有的话)。即使该变量仅在类内部使用,我也使用自动属性。这样,我添加了一层抽象,这意味着如果我改变了一些东西,需要重构的代码更少。

                  顺便说一句,你的 void 函数不能返回一个字符串..... :-)

                  【讨论】:

                    【解决方案12】:

                    我只是想补充一点,MSDN 命名指南没有指定这一点,因为它只有公共接口的指南(即属性名称、公共方法、公共方法参数等......)他们不关心私人成员风格,就微软而言,你可以使用你和你的团队想要的任何东西。

                    【讨论】:

                      【解决方案13】:

                      首先,我,以及与我共事过的许多其他人已经取消了使用“m_”作为私有成员前缀的做法。接下来,每当我在类中引用私有成员时,我通常使用“this.privateMemberVariableName”中的 this 这个词。使用这个就足以区分变量不是局部变量,也不是方法内作为参数传递的变量。

                      如果公共属性名称包含的逻辑不仅仅是引用私有成员变量,例如实例化连接或将属性值保存在视图状态中,我确实会引用它。

                      【讨论】:

                        【解决方案14】:

                        framework Design guidelines book 说你不应该在你的变量前加上 _ - 你应该只使用小写的变量名,我相信 Code Complete 第 2 版说你不应该在你的变量前加上 m_ .

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2022-11-01
                          相关资源
                          最近更新 更多