我正在浏览XNA物理库的一些文档,并注意到有人用它来为Car创建一个类。
这是一个非常简单的例子:
Class Car
{
private float gravity;
private float maxSpeed;
public Car(float gravity, float maxSpeed)
{
this.gravity = gravity;
this.maxSpeed = maxSpeed;
}
}
现在当我创建一个构造函数并设置传入参数的赋值时,我会这样做:
Class Car
{
private float _gravity;
private float _maxSpeed;
public Car(float gravity, float maxSpeed)
{
_gravity = gravity;
_maxSpeed = maxSpeed;
}
}
这两种方法都有任何优势吗?我只是偶然发现过几次,但我认为这样做是有充分理由的,我只是在寻找“最佳实践”的方式。
谢谢!
答案 0 :(得分:4)
两个示例在功能上都相同,并且两种方法都由不同的人使用。这取决于你使用哪种命名惯例。如果您确实为该字段指定了与参数相同的名称,则必须使用this
来访问该字段。
重要的是要在命名方面保持一致。我个人更喜欢使用this
关键字访问字段,但这里肯定有很多人喜欢下划线方法。
<强>下划线强>
如果您在私有字段前加下划线,那么无论您在何处引用它,您都需要使用它。很明显(假设您知道惯例)它是一个私有领域,只是从它看。不幸的是,它也很难看,但这只是我的观点。
没有下划线:
如果您没有在私人字段前加下划线,那么您可以直接或通过this
关键字引用选项。这意味着可能会忘记,在您的示例中,您可以将参数分配给自己:gravity = gravity;
这至少应该生成警告。如果您使用StyleCop工具,则默认情况下会强制您始终通过this
关键字访问私人字段。
有关更多答案,请参阅以下类似问题:
答案 1 :(得分:3)
随着自动属性的出现,这也变得非常受欢迎......
public class Car
{
public Car(float gravity, float speed)
{
Gravity = gravity;
Speed = speed;
}
protected float Gravity { get; private set; }
...
我个人更喜欢这种方法,但我讨厌你不能将自动属性标记为只读。
答案 2 :(得分:2)
两者都是常见的方法,两者都非常好。
我个人更喜欢第一个,因为我发现下划线很难看。但是很多人更喜欢使用下划线,因为它们有助于识别变量是类的成员而不是局部变量。
答案 3 :(得分:1)
要么是好的。我个人更喜欢this.
方法,尤其是autoproperties的出现。例如:public string Something {get; set;}
。保留构造函数参数名称与属性名称相同,使用户可以非常清楚地指示代码将在何处结束。
答案 4 :(得分:1)
如果您遇到Resharper,则以下是一些默认约定:
使用下划线声明全局变量。
string _variable1;
作为常量的全局变量应在上层CamelCase中声明。
const string Variable1;
属性应始终位于CamelCase的上部。
string Variable1 {get; set;}
我可能不喜欢下划线,但我确实看到它们如何帮助您识别范围。
答案 5 :(得分:0)
有一些可读性问题,“这个”可以帮助解决。我一直在很多情况下,我正在阅读某些代码,以了解它是如何工作的,或者我是如何从中得到的。通过一堆复杂的相互关联的类阅读,你会发现像
这样的东西var foo =_FatNumber;
所以你开始搜索_FatNumber并找不到它。那是因为它在基类中。如果它被标记为base.Fatnumber你知道不要在这里寻找,而this.SlimNumber非常明确。我主张明确标记谁声明变量(通常是var的控制器)。也许这只是一个更复杂的派生类的问题,但它可以节省我很多时间来理解类的行为。
例如:
public class FooBase
{
protected int Foo { get; set; }
}
public class FooDerived : FooBase
{
int Bar = 9;
public int GetTheThing(bool something)
{
if (somthing)
return this.Bar;
else
return base.Foo;
}
}