使用它更好吗?在代码之前?

时间:2013-07-31 15:38:28

标签: c# winforms this

我有时需要上网查找教程。我经常发现有些人会这样写代码:

this.button1.Text = "Random Text";

然后我找到像这样的代码:

button1.Text = "Random Text";

使用this.whatever是否更好或者无关紧要?

11 个答案:

答案 0 :(得分:10)

这取决于。这是一个示例类:

class A
{
    private int count;
    public A(int count)
    {
        this.count = count;
    }
}

在这种情况下,“这个”。是强制性的,因为它消除了赋值左侧的引用的歧义。没有它,您不清楚读取代码“count”是指参数还是字段。 ( 对编译器来说是明确的,它有遵循的规则。)但在大多数情况下,这纯粹是一个偏好问题。

答案 1 :(得分:7)

编写所有代码以强调读者的重点。如果您认为读者清楚地了解标识符是指实例成员,那么请使用this。如果您认为它是一个不重要且分散注意力的实现细节,请不要这样做。使用良好的判断力使您的代码可读。

答案 2 :(得分:3)

没关系,这是一种风格问题。我倾向于省略this,因为它只是精神上解析的额外代码。

唯一重要的是当本地变量和实例变量之间存在命名冲突时,this可用于消除字段和局部变量之间的歧义。

以下是 重要的情况类型示例:

public class Foo
{
    private string x;

    public Foo(string x)
    {
        // x = x;      Assigns local parameter x to x, not what we want
        this.x = x; // Assigns instance variable x to local parameter x: this disambiguates between the two.
    }
}

答案 3 :(得分:3)

this只是为了说清楚,在某些情况下我们必须使用this

  1. 区分parameterlocal member

    //local member
    object item;
    private void SomeMethod(object item){
        this.item = item;//must use this
    }
    
  2. 将当前的类实例传递给另一个方法:

    public class SomeClass {
      private void SomeMethod(SomeClass obj){
         //....
      }
      private void AnotherMethod(){
        SomeMethod(this);//pass the current instance into SomeMethod
        //.....
      }
    }
    
  3. 在扩展方法中使用:

    public static class SomeClassExtension {
        public static void SomeClassMethod(this SomeClass obj){
            //use obj as a reference to the object calling this method...
        }
    }
    
  4. 从另一个构造函数(具有不同签名)调用构造函数:

    public Form1(string s) : this() {//Call the Form1() before executing other code in Form1(string s)
       //......
    }
    
  5. 用于声明索引器:

    public class SomeClass {
       //declare an index returning a string
       public string this[int index] {
          get {return ...}
          set { ... }
       }
    }
    
  6. struct中使用自动属性:

    public struct SomeStruct {
       public object AutoProp1 {get;set;}
       public object AutoProp2 {get;set;}
       public SomeStruct() : this() //must use this
       {
          AutoProp1 = someObject;
          AutoProp2 = someObject;
       }
    }
    
  7. 将当前实例强制转换为基类/类型:

    public class ClassB : ClassC {
        //...
    }
    public class ClassA : ClassB {
        public ClassA(){
           ((ClassC)this).MemberOfClassC ... ;//There might be some member in ClassC
           //which is overridden in ClassA or ClassB, casting to ClassC can help we invoke the original member instead of the overridden one.
        }
    }
    
  8. this可能还有其他用途,但如果我想出来,我会稍后更新。

答案 4 :(得分:2)

使用this的示例可以是在范围内已有类似变量时访问类变量。 Otherwise it is mostly of choice

实施例

public class Test
{
    public string firstName { get; set; }       

    public void temp(string firstName)
    {
        firstName = this.firstName;
    }
}

答案 5 :(得分:2)

关于字段,明确需要this的唯一情况是存在命名冲突时:

public class Foo
{
    private string bar;

    public Foo(string bar)
    {
        this.bar = bar;
    }
}

所以有些人会在前面加下划线:

public class Foo
{
    private string _bar;

    public Foo(string bar)
    {
        _bar = bar;
    }
}

答案 6 :(得分:2)

通常没关系。您可以使用this.的原因是明确表示您要引用属于当前类的属性/字段。

同样,在您可能需要这种情况的情况下并不多,但是例如,您可能有一个与类级别属性/字段同名的局部变量。然后你可以使用this.

例如:

class MyClass
{
    string s = "1";

    void MyFunction(string s)
    {
        //s = local value as passed in to function
        //this.s = "1"
    }
}

答案 7 :(得分:1)

通常并不重要。 this关键字“引用类的当前实例,并且还用作扩展方法的第一个参数的修饰符。”

查看这篇文章。

http://msdn.microsoft.com/en-us/library/dk1507sz.aspx

答案 8 :(得分:1)

正如其他人已经指出的那样,它有助于区分字段/属性和方法变量,需要this的另一个地方是调用当前实例上的扩展方法。例如,this.ExtensionMethod();可以使用,但不仅仅是ExtensionMethod();

除此之外,它是个人选择的问题,有些人称之为冗余,有些人喜欢使用它。这完全取决于你和你的团队。

我个人喜欢将this与类成员一起使用,特别是对于Forms方法,如果使用winform的代码隐藏,如this.Close();

有关何时使用this的详细信息,请参阅:When do you use the "this" keyword?

答案 9 :(得分:1)

通常没关系,但是如果你把一个名为button1的变量传递给一个已经有一个名为button1的成员的类方法,那么你需要消除你真正想要的那个。

这可能就是为什么人们现在使用this.来明确说明你的意思,如果你一直使用这种做法,那么在少数重要的情况下你就不会错。

当然,您可以确保所有成员变量都具有唯一名称,例如使用m_这样的前缀,但现在已经过时了,人们更愿意写出this.

答案 10 :(得分:1)

这实际上取决于具体情况。

http://msdn.microsoft.com/en-us/library/dk1507sz(v=vs.80).aspx

  
      
  • 限定以类似名称隐藏的成员
  •   
  • 将对象作为参数传递给其他方法
  •   
  • 申报指数
  •