C# 您什么时候使用;这";关键词?

C# 您什么时候使用;这";关键词?,c#,coding-style,this,C#,Coding Style,This,我很好奇其他人是如何使用这个关键字的。我倾向于在构造函数中使用它,但我也可能在整个类的其他方法中使用它。一些例子: 在构造函数中: public Light(Vector v) { this.dir = new Vector(v); } 别处 public void SomeMethod() { Vector vec = new Vector(); double d = (vec * vec) - (this.radius * this.radius); } 我每次引

我很好奇其他人是如何使用这个关键字的。我倾向于在构造函数中使用它,但我也可能在整个类的其他方法中使用它。一些例子:

在构造函数中:

public Light(Vector v)
{
    this.dir = new Vector(v);
}
别处

public void SomeMethod()
{
    Vector vec = new Vector();
    double d = (vec * vec) - (this.radius * this.radius);
}

我每次引用实例变量时都使用它,即使我不需要这样做。我认为它使代码更加清晰。

我在任何可能存在歧义的地方使用它(显然)。不仅仅是编译器的模糊性(在这种情况下是必需的),还有查看代码的人的模糊性。

我倾向于用uu来下划线字段,所以实际上不需要使用这个。R r也倾向于重构它们……

你应该总是使用它,我用它来修改私有字段和参数(因为我们的命名约定声明了我们不使用成员和参数名的前缀(它们是基于因特网上找到的信息,所以我认为这是一个最佳实践))

我只在绝对必要的情况下使用它,即当另一个变量隐藏另一个变量时。例如:

class Vector3
{
    float x;
    float y;
    float z;

    public Vector3(float x, float y, float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }

}

或者正如Ryan Fox指出的,当您需要将其作为参数传递时。(局部变量优先于成员变量)

任何时候需要引用当前对象时

一个特别方便的场景是当您的对象正在调用一个函数并希望将自己传递给它时

例如:

void onChange()
{
    screen.draw(this);
}

我几乎只在从同一类型内部引用类型属性时使用这个。正如另一位用户所提到的,我还强调了本地字段,因此它们不需要就可以看到。这取决于我使用的编码标准。如果我们用u表示一个实例变量,那么“this”就变得多余了。如果我们不使用uu,那么我倾向于用它来表示实例变量。

我也倾向于在任何地方使用它,只是为了确保我们正在处理的是实例成员。

我不能相信所有人都说使用它总是“最佳实践”之类的

当存在歧义时,如中或需要将对象作为参数传递时,请使用“this”,如中。没有理由使用它,因为能够基于范围链解析变量应该足够清楚,不需要使用它限定变量

编辑:关于“this”的C#文档表明,除了我提到的两个之外,“this”关键字还有一个用法-


编辑:@Juan:Huh,我没有发现我的陈述中有任何不一致之处-有3次我会使用“this”关键字(如C#文档中所记录的),而这些都是你真正需要它的时候。在没有阴影的情况下,在构造函数中的变量前面粘贴“this”只不过是浪费击键和阅读时间,没有任何好处。

我在任何时候告诉我就使用它。必须服从。哦,是的。

我不是有意让这听起来很刺耳,但这没关系

真的

看看那些重要的事情:你的项目,你的代码,你的工作,你的个人生活。他们中没有一个人的成功取决于您是否使用“this”关键字来限定对字段的访问。此关键字不能帮助您按时发货。它不会减少bug,也不会对代码质量或可维护性产生任何明显的影响。这不会给你加薪,也不会让你在办公室的时间减少

这真的只是一个风格问题。如果你喜欢“这个”,那么就用它。如果你没有,那就不要。如果您需要它来获得正确的语义,那么就使用它。事实上,每个程序员都有自己独特的编程风格。这种风格反映了特定程序员对“最美观的代码”应该是什么样子的概念。根据定义,任何其他读取您代码的程序员都将拥有不同的编程风格。这意味着你总是会做一些别人不喜欢的事情,或者会做得不一样。在某个时刻,有人会读你的代码并抱怨一些事情


我不会为此烦恼的。我只想根据您自己的喜好确保代码尽可能美观。如果你问10个程序员如何格式化代码,你会得到大约15个不同的意见。更好的关注点是代码是如何分解的。事物抽象化了吗?我是否为事物选择了有意义的名称?有很多代码重复吗?有什么方法可以简化事情吗?我认为,正确处理这些事情将对您的项目、代码、工作和生活产生最大的积极影响。巧合的是,这可能也会导致另一个人抱怨最少。如果您的代码工作正常,易于阅读,并且考虑因素充分,那么其他人就不会仔细检查您如何初始化字段。他只会使用你的代码,惊叹它的伟大,然后转向其他东西。

关键字在C#中有几种用法

  • 使对象从方法返回自身
  • 在当前实例上调用扩展方法
  • 使自己变成另一种类型
  • 您可以通过在作用域中不使用同名的成员和局部变量来避免第一种用法,例如遵循常见的命名约定,并使用属性(Pascal大小写)而不是字段(驼峰大小写),以避免与局部变量(也是驼峰大小写)发生冲突。在C#3.0中,可以使用将字段轻松转换为属性。

    我使用它的时候如下所示:

    • 从类内访问私有方法(以区分)
    • 将当前对象传递给另一个方法(或在发生事件时作为发送方对象)
    • 创建扩展方法时:D
    我不将其用于私有字段,因为我在Private fie前面加前缀
    boolean sameValue (SomeNum other) {
       return this.importantValue == other.importantValue;
    } 
    
    A a;
    a = a;
    
    A& A::operator=(const A& a) {
        if (this == &a) return *this;
    
        // we know both sides of the = operator are different, do something...
    
        return *this;
    }
    
    class Example : ICloneable
    {
        private void CallClone()
        {
            object clone = ((ICloneable)this).Clone();
        }
    
        object ICloneable.Clone()
        {
            throw new NotImplementedException();
        }
    }
    
    class MyClass {
        private int _x
        public MyClass() : this(5) {}
        public MyClass(int v) { _x = v;}
    }
    
     public void setFoo(int foo) {
         this.foo = foo;
     }
    
    notifier.addListener(this);
    
    template <typename T>
    struct base {
       void f() {}
    };
    
    template <typename T>
    struct derived : public base<T>
    {
       void test() {
          //f(); // [1] error
          base<T>::f(); // quite verbose if there is more than one argument, but valid
          this->f(); // f is now an argument dependent symbol
       }
    }
    
    class AABB
    {
      // ... members
      bool intersects( AABB other )
      {
        return other.left() < this->right() &&
               this->left() < other.right() &&
    
               // +y increases going down
               other.top() < this->bottom() &&
               this->top() < other.bottom() ;
      }
    } ;
    
    class AABB
    {
      bool intersects( AABB other )
      {
        return other.left() < right() &&
               left() < other.right() &&
    
               // +y increases going down
               other.top() < bottom() &&
               top() < other.bottom() ;
      }
    } ;