在C#中,在类中引用成员属性的普遍接受的方法是什么?

时间:2009-01-21 20:48:53

标签: c# naming-conventions class-design

已阅读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
  • _name
  • 名称
  • myName或其他随机标识符

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

作为后续行动,在课程方法中,您是指内部(私人)标识符还是公共属性访问者?

14 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

我使用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.,这使得阅读更容易。

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

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

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

我发现下划线前缀是一个方便的视觉辅助工具,这使得它显然是一个私人成员,而不必移动光标。

答案 5 :(得分:1)

我曾经非常反对'_'前缀,但是当你想快速访问一个成员字段而不必输入很多字母时,它对intellisense非常有用。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我会回答以前的答案,因为你应该坚持使用你的团队使用的方案,或者如果你不在团队中,那么你应该使用你所使用的任何方案。

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

答案 8 :(得分:0)

我认为普遍接受的命名约定只是为了使名称有意义(并且代码干净简单)。在我看来,如果我的代码中的标识符因任何原因需要视觉提示,那么它太复杂了,名称通常也不完全准确。

我已经研究过需要手动读取的代码......“m”表示类级别,“p”表示参数等。命名约定是为了使代码更易于阅读但结束而开发的正好相反,因为开发人员认为“好的”命名约定意味着可读的代码。

请确保此Dennis Green(前亚利桑那红衣主教练)引用适用于您的标识符:“他们是我们认为的人!”

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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

我个人,只有通过getter / setter才能访问变量。即使变量仅在类内部使用,我也使用自动属性。这样,我添加了一层抽象,这意味着如果我改变了某些东西,重构的代码就会减少。

BTW,你的void函数不能返回一个字符串.....: - )

答案 11 :(得分:0)

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

答案 12 :(得分:0)

首先,我和我合作的许多其他人已经废除了使用“m_”为私有成员添加前缀。接下来,每当我引用类中的私有成员时,我通常会使用“this.privateMemberVariableName”中的单词this。使用它足以区分变量不是局部变量或作为方法中的参数传递的变量。

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

答案 13 :(得分:0)

framework Design guidelines book表示你不应该在变量前面添加_ - 你应该只用一个小写的变量名称,而Code Complete第二版我认为你不应该在你的变量前面加上前缀与m _。