【问题标题】:Correct use of this. in a class constructor正确使用这个。在类构造函数中
【发布时间】:2010-08-14 23:56:20
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: c# .net this default-constructor


    【解决方案1】:

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

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

    下划线:

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

    无下划线:

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

    查看这些类似问题以获得更多答案:

    【讨论】:

      【解决方案2】:

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

      public class Car
      {
        public Car(float gravity, float speed)
        {
          Gravity = gravity;
          Speed = speed;
        }
      
        protected float Gravity { get; private set; }
        ...
      

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

      【讨论】:

      • Rob: +1 你可能对这个问题感兴趣stackoverflow.com/questions/2480503/…
      • 出于某种原因,我从未想过要这样做。我想我有一个新的首选方法。 ;-)
      • +1 - 好主意,我一定会在某个时候试一试!
      【解决方案3】:

      这两种都是常用的方法,而且都很好。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          如果您遇到过Resharper,以下是它的一些默认约定:

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

            字符串_variable1;

          • 作为常量的全局变量应该用大写的 CamelCase 声明。

            常量字符串变量1;

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

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

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

          【讨论】:

            【解决方案6】:

            “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;
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2014-03-08
              • 1970-01-01
              • 1970-01-01
              • 2023-03-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-02-07
              • 1970-01-01
              相关资源
              最近更新 更多