我经常发现我想在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看到参数。我不喜欢编写代码的特定内容是:
this.engine = Engine;
似乎每个名字都是孤立的,但它们一起是坏的。有什么东西要屈服,但是什么呢?我更喜欢更改私有字段,因为它对用户不可见,所以我通常会以m_engine
结束,这会解决一些问题,但会引入前缀并且不会阻止Intellisense更改{{1} } engine
。
您如何重命名这四项?为什么呢?
(注意:我意识到这个例子中的属性可能是一个自动属性。我只是不想让这个例子过于复杂。)
另见: Am I immoral for using a variable name that differs from its type only by case?
答案 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)
这使得以不同方式命名参数和局部变量成为可能。
答案 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;