正确使用这个。在类构造函数中

时间:2010-08-14 23:56:20

标签: c# .net this default-constructor

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

这两种方法都有任何优势吗?我只是偶然发现过几次,但我认为这样做是有充分理由的,我只是在寻找“最佳实践”的方式。

谢谢!

6 个答案:

答案 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;
    }
}