4

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

this.button1.Text = "Random Text";

然后我发现代码是这样的:

button1.Text = "Random Text";

是使用更好this.whatever还是没关系?

4

11 回答 11

10

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

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

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

于 2013-07-31T15:39:59.930 回答
7

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

于 2013-07-31T15:58:13.643 回答
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.
    }
}
于 2013-07-31T15:40:14.710 回答
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.
        }
    }
    

可能还有其他用途this,但如果我想到了,我稍后会更新。

于 2013-07-31T15:51:31.933 回答
2

this当您在范围内已经有类似的变量时,可以使用一个示例 来访问类变量。Otherwise it is mostly of choice.

例子

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

    public void temp(string firstName)
    {
        firstName = this.firstName;
    }
}
于 2013-07-31T15:42:43.707 回答
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;
    }
}
于 2013-07-31T15:43:31.413 回答
2

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

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

例如:

class MyClass
{
    string s = "1";

    void MyFunction(string s)
    {
        //s = local value as passed in to function
        //this.s = "1"
    }
}
于 2013-07-31T15:43:37.540 回答
1

通常没关系。this 关键字“引用类的当前实例,也用作扩展方法的第一个参数的修饰符”。

看看这篇文章。

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

于 2013-07-31T15:40:39.027 回答
1

正如其他人已经指出的那样,将字段/属性与方法变量区分开来很有用,另一个需要的地方this是在当前实例上调用扩展方法。例如this.ExtensionMethod();会工作,但不仅仅是ExtensionMethod();

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

就我个人而言,我喜欢this与类成员一起使用,特别是在处理 winform 的代码隐藏时使用 Forms 方法,例如this.Close();

有关何时使用的更多讨论,this请参阅:您何时使用“this”关键字?

于 2013-07-31T15:40:56.967 回答
1

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

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

当然,您可以确保所有成员变量都是唯一命名的,例如带有前缀m_,但是现在已经过时了,人们更喜欢写出来this.

于 2013-07-31T15:42:18.593 回答
1

这真的取决于情况。

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

  • 限定被相似名称隐藏的成员
  • 将对象作为参数传递给其他方法
  • 声明索引器
于 2013-07-31T15:42:39.550 回答