2

我正在浏览 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;
  }
}

这两种方法有什么优势吗?我只遇到过几次,但我认为这样做是有充分理由的,我只是在寻找“最佳实践”的方式。

谢谢!

4

6 回答 6

4

这两个示例在功能上是相同的,并且两种方法都被不同的人使用。使用哪种命名约定取决于您。如果您确实为该字段提供了与参数相同的名称,那么您将不得不使用this它来访问它。

重要的是在你的命名中保持一致。我个人更喜欢使用关键字访问字段this,但这里肯定有很多人喜欢下划线的方法。

下划线:

如果您在私有字段前加上下划线,那么无论您在哪里引用它,您都需要使用它。很明显(前提是你知道约定)它是一个私有字段,仅仅从它的角度来看。不幸的是,它也很丑陋,但这只是我的看法。

没有下划线:

如果您不使用下划线作为私有字段的前缀,那么您可以选择直接引用它或通过this关键字引用它。这意味着可能会忘记,并且在您的示例中,您可以将参数分配给自身:gravity = gravity;不过,这至少应该会产生警告。如果您使用StyleCop工具,则默认情况下会强制您始终this通过关键字访问私有字段。

有关更多答案,请参阅这些类似的问题:

于 2010-08-15T00:02:32.293 回答
3

随着自动属性的出现,这也变得非常流行......

public class Car
{
  public Car(float gravity, float speed)
  {
    Gravity = gravity;
    Speed = speed;
  }

  protected float Gravity { get; private set; }
  ...

我个人更喜欢这种方法,尽管我讨厌您不能将自动属性标记为只读。

于 2010-08-15T00:06:46.323 回答
2

两者都是常见的方法,并且都非常好。

我个人更喜欢第一个,因为我发现下划线很难看。但是很多人更喜欢使用下划线,因为它们有助于识别 a 变量是类的成员,而不是局部变量。

于 2010-08-14T23:59:45.643 回答
1

哪一个都好。我个人更喜欢这种this.方法,尤其是随着自动属性的出现。例如:public string Something {get; set;}。让构造函数参数名称与属性名称相同,可以让调用代码的用户非常清楚地指示值将在哪里结束。

于 2010-08-15T00:07:35.783 回答
1

如果你遇到过Resharper,这里有一些它的默认约定:

  • 全局变量用下划线声明。

    字符串_变量1;

  • 作为常量的全局变量应在大驼峰格式中声明。

    常量字符串变量1;

  • 属性应始终使用大驼峰命名法。

    字符串变量 1 {get;set;}

我可能不喜欢下划线,但我确实看到了它们如何帮助您识别范围。

于 2010-08-15T00:26:36.593 回答
0

有一些“this”可以帮助解决的可读性问题。我在很多情况下都在阅读某人的代码以了解它是如何工作的,或者我如何从中获得。阅读一堆复杂的相互关联的类,你会发现类似

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;
    }
}
于 2010-08-15T01:03:56.757 回答