您如何在.NET中命名这些相关的属性,类,参数和字段?

时间:2009-01-20 15:51:22

标签: c# .net

我经常发现我想在C#中编写类似这样的代码,但我对标识符名称感到不舒服:

public class Car
{
    private Engine engine;
    public Engine Engine
    {
        get
        {
            return engine;
        }
        set
        {
            engine = value;
        }
    }
    public Car(Engine engine)
    {
        this.engine = engine;
    }
}

这里我们有四种不同的东西叫做“引擎”:

  • Engine上课。引擎似乎是一个很好的,自然的名字。
  • Engine公共财产。似乎很傻把它称为MyEngine或TheCarsEngine。
  • engine支持该属性的私有字段。某些命名方案会推荐m_engine_engine,但其他人则表示应避免使用所有前缀。
  • engine构造函数上的参数名称。我见过命名方案,建议在所有参数前加下划线,例如_engine。我真的不喜欢这个,因为调用者可以通过Intellisense看到参数。

我不喜欢编写代码的特定内容是:

  • 如果您在构造函数中更改参数名称但在构造函数体中错过了它的使用,则会得到编译器可能无法发现的细微错误。
  • Intellisense有一个坏习惯,就是为你自动完成错误的事情,有时候你不会注意到它改变了这种情况。如果构造函数主体意外结束this.engine = Engine;
  • ,您将再次获得一个微妙的错误

似乎每个名字都是孤立的,但它们一起是坏的。有什么东西要屈服,但是什么呢?我更喜欢更改私有字段,因为它对用户不可见,所以我通常会以m_engine结束,这会解决一些问题,但会引入前缀并且不会阻止Intellisense更改{{1} } engine

您如何重命名这四项?为什么呢?

(注意:我意识到这个例子中的属性可能是一个自动属性。我只是不想让这个例子过于复杂。)

另见: Am I immoral for using a variable name that differs from its type only by case?

9 个答案:

答案 0 :(得分:12)

在这种情况下,我会将它们命名为与示例中的完全相同。

这是因为命名很明确,每个元素保存和/或将用于哪些数据。

我唯一要为C#3改变的是使用一个自动属性来删除局部变量。

答案 1 :(得分:5)

对于私人会员,我总是以下划线作为前缀:

private Engine engine;

变为:

private Engine _engine;

每当我看到m_时,就会让我的胃部流失。

答案 2 :(得分:3)

像这样:

public class Car
{    
    #region fields

    private Engine _engine;

    #endregion

    #region public properties

    public Engine Engine { get { return _engine; } set { _engine = value; } }  

    #endregion 

    #region constructors 

    public Car(Engine engine)    
    { 
        _engine = engine; 
    }

    #endregion
}

可悲的是,SO代码样式表正在删除我的空行,这使得它更清晰,更容易阅读。我们在所有生产代码上使用的区域指令有助于避免混淆。下划线前缀是我使用的唯一前缀(好吧,除了我在接口上但每个人都这样做)但我确实使用它,所以我们从不混淆字段和本地(如在contstructor中)。我认为使属性名称和类型名称相同没有任何重大问题(在VS中,突出显示将区分它们)。如果您尝试使用该类型的静态成员或方法,这只是一个问题,如果您这样做,则您必须使用别名或明确引用它(即MyNamespace.VehicleParts.Engine.StaticMethod())。

对我来说似乎是可读的,但这一切都非常主观。

答案 3 :(得分:1)

  • 成员:m_engine;
  • 静态成员:sm_engine;
  • 参数:engine
  • 本地变量:_engine
  • 类:引擎
  • 物业:引擎

这使得以不同方式命名参数和局部变量成为可能。

答案 4 :(得分:0)

我更喜欢使用一些前缀(我使用'_')作为私有字段,否则它们看起来与参数和本地相同。除此之外,我使用类似的方法命名,就像你在这里做的那样,虽然Engine可能有点通用,这取决于程序的一般程度。

我认为我更喜欢CarEngine,或者AutoEngine,或类似的东西,因为程序员喜欢使用Engine作为隐喻,而不是对应于真实引擎的东西。

答案 5 :(得分:0)

我通常使用下划线为私有字段添加前缀,因此我将其称为_engine。而且我经常使用非常短的(例如首字母)参数名称,因此它将是 Engine e (毕竟,intellisense用户获得类型名称)。我要么保留类和对象名称相同,要么(通常)提出不同的名称,即使它是 MyEngine carEngine

所以:
公共汽车

{    
    #region fields

    private Engine _engine;

    #endregion

    #region public properties

    public Engine carEngine { get { return _engine; } set { _engine = value; } }  

    #endregion 

    #region constructors 

    public Car(Engine e)    
    { 
        _engine = e; 
    }

    #endregion
}

答案 6 :(得分:0)

我不喜欢匈牙利符号:m_foo等我正在使用骆驼风格:engine, myEngine, myBigEngine

我会像你一样写得很好。

在MSDN中,我看到一句话:使用public Car(Engine e) - 我的意思是名称输入参数作为局部变量。但我不这样做。

答案 7 :(得分:0)

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

作为一个视觉辅助工具,您可能希望在私有成员前加上下划线_engine,这样很明显它是私有成员而不必移动光标。这是我使用的约定,它是我将在您的示例中更改的唯一名称。

答案 8 :(得分:0)

public class Car
{

    public Car(Engine engine)
    {
        Engine = engine;
    }

    public Engine Engine { get; set; }

}

如果我有一个字段,我用前缀(_)作为前缀。 所以 私人引擎引擎; 会变成 私人发动机_engine;