与IntelliSense配合使用的命名约定

时间:2010-01-01 14:46:33

标签: c#

我开始命名我的类即时变量,如下所示:

    Car car;

原因是我认为汽车是变量的完美描述,我不需要添加其他信息。

这对我很有用,我很高兴,但有一个问题让我发疯。如果我想做私有变量的类型,它会与IntelliSense混淆,反之亦然。

我见过人们这样做:

    Car myCar;

我并不为此疯狂,但它可能会奏效。

关于如何做得更好的任何想法?

我想补充一点,这主要适用于在方法内创建的类的实例。

7 个答案:

答案 0 :(得分:3)

在看到这样的代码时,我会指出两件事。

您显然没有变量的命名约定。我认为这样的约定非常有用,特别是对于区分属性,成员变量和局部变量。

.NET生态系统中的常见约定是:

  • _privateVariable(由Microsoft使用 还有很多设计师生成的代码, 例如LINQ2SQL)

  • m_privateVariable(也被Microsoft使用,我认为TypedDatasets是 使用这个约定生成,但我不确定。)

  • 属性始终使用PascalCaseAndNoExtras
  • loacl varaibles总是camelcaseAndNoExtras

第二件事是关于命名类似于类的变量。我认为最好不要将类的名称用作变量名。 一个好的变量名称应该在变量所在的范围内传达变量的类型含义

E.g。如果您想显示客户喜欢租用的汽车信息,您宁愿为变量m_CarToRent而不是m_Car命名。

答案 1 :(得分:2)

您还可以使用this关键字this.car。它将解决你的intellisense问题。 我自己更喜欢Daniel建议使用像_car这样的下划线。

答案 2 :(得分:1)

有些人和我一样,使用_Car作为私有成员变量。

答案 3 :(得分:1)

其中一个好的做法是:

public class Driver
{
 private Car _car;
 public Car Car { get { return _car; } }
 public Driver(Car car)
 {
  _car = car;
 }
}

_意味着,班级的客户看不到这个,并且它比'm_'更好,因为它不会向'_'或'我'添加任何东西,因为“我的”已经是一个假设用法。

作为指导,您可以尝试安装Resharper http://www.jetbrains.com/resharper/,您很快就会习惯于一个好的命名约定。

在我尝试之前,我总是更改我的命名约定样式,并且无法在这里和那里摆脱尴尬的'this'关键字。

答案 4 :(得分:1)

第一种方法是使用前缀。我使用诸如m,e,v,i,p(MemberVariable,Event,Volatile,Index / Iterator,Pointer)等前缀,这使我可以在intellisense中看到这些不同的用法变量。列表,以及立即了解变量应如何从其名称中使用。我真的不明白为什么有些人不这样做 - 这是一种经过长期验证的方法,可以加快编码速度,使编程更容易,更不易出错(特别是指针和指针指针)。多年来,我看到团队中的程序员拒绝遵循这些简单的约定,有很多可以避免的错误。

第二种是更好地区分类型名称和实例。 使用Car car,甚至更糟糕的是,您正确指出的属性Car Car {get;set;}相当令人困惑。长期以来人们一直认为,仅基于案例区分名称是件坏事,而且两个名称相同(类型,属性)的名称更差。

但是有一些方法可以用来避免这种情况(特别是对于你可能没有使用前缀的参数/本地人):

  • 使用同义词:Vehicle car;
  • 使用常规(类型)和特定于上下文(实例)的术语Vehicle licensedVehicle。这有助于您的实例代码不仅描述某些东西是汽车,而且还描​​述了您希望它是什么形式的汽车

最后,随着您将来扩充代码,情况会变得更糟。请记住,当您使用模糊(有效“不可扩展”)命名构建类层次结构时会发生什么:

你从像Vehicle.Type这样的名字开始。这似乎是合乎逻辑的:车辆的类型(私人,乘客,轻货,重货)。然后你添加派生类Car,Bus,Truck。对于公共汽车(类型=乘客),您想要添加“类型”(小巴,长途汽车,双层)。所以现在你有了基类Vehicle.Type和派生类Bus.Type,这意味着完全不同的东西。通过调用它们来避免在两种情况下使用通用术语“类型”(例如)Vehicle.VehicleType和Bus.BusType极大地澄清了事情,并消除了程序员混淆它们的任何机会。

(这不是一个很好的例子,因为我基于汽车命名理念,但希望它能够跨越一般点 - 良好,具体,描述性的命名可以最大限度地减少您的班级用户和维护者的混淆。你的代码将来会面临)

答案 5 :(得分:1)

我通常会在(local)变量前面使用“current”,特别是如果它在循环中。

Car currentCar = new Car();

foreach( var currentCar in CarList ) {
   currentCar.Xxxx();
}

我发现这有助于提高可读性,但它完全是主观的。

答案 6 :(得分:0)

不仅令VS感到困惑,而且它在概念上也令人困惑。 Car应该是AccordCelicaMini以及实例myCarcar1等等: - )