C#何时使用“此”关键字

时间:2009-05-09 13:14:16

标签: c# constructor this

  

可能重复:
  When do you use the “this” keyword?

您好, 我理解This关键字用于引用类的实例,但是,假设我有一个名为Life的类,它定义了两个字段,person(他们的名字)和他们的伙伴(他们的名字):

class Life
{
    //Fields
    private string _person;
    private string _partner;

    //Properties
    public string Person
    {
        get { return _person; }
        set { _person = value; }
    }

    public string Partner
    {
        get { return _partner; }
        set { _partner = value; }
    }

    //Constructor 1
    public Life()
    {
        _person = "Dave";
        _partner = "Sarah";

        MessageBox.Show("Life Constructor Called");
    }

    //Constructor 2
    public Life()
    {
        this._person = "Dave";
        this._partner = "Sarah";

        MessageBox.Show("Life Constructor Called");
    }
}

构造函数1和构造函数2之间是否存在差异!? 或者使用“This”关键字是否只是更好的编码习惯?

此致

8 个答案:

答案 0 :(得分:23)

构造函数是相同的。 我更喜欢第二个的原因是它允许你从私有变量名中删除下划线并保留上下文(提高可理解性)。我指的是在引用实例变量和属性时总是使用this

在转移到具有不同标准的其他公司后,我不再以这种方式使用this关键字。我已经习惯了它,现在在引用实例成员时很少使用它。我仍然建议使用属性(显然)。

我的班级版本:

class Life
{
    //Fields
    private string person;
    private string partner;

    //Properties
    public string Person
    {
        get { return this.person; }
        set { this.person = value; }
    }

    public string Partner
    {
        get { return this.partner; }
        set { this.partner = value; }
    }


    public Life()
    {
        this.person = "Dave";
        this.partner = "Sarah";

        MessageBox.Show("Life Constructor Called");
    }
}

或更好,但不清楚this与字段的使用。

class Life
{

    //Properties
    public string Person { get; set; }
    public string Partner { get; set; }

    public Life()
    {
        this.Person = "Dave";
        this.Partner = "Sarah";

        MessageBox.Show("Life Constructor Called");
    }
}

答案 1 :(得分:13)

“this”也在.Net 3.5中使用扩展方法:

public static class MyExtensions
{    
    public static string Extend(this string text)
    {
       return text + " world";
    }
}

会扩展字符串类

var text = "Hello";
text.Extend();

回答你的问题:不,你的两个构造函数没有区别。 Imo,“this”使代码混乱,只应在必要时使用,例如当参数和字段变量具有相同的名称时。

还有一种情况是类显式实现了接口。如果需要从类中调用接口方法,则必须将其转换为接口:

class Impl : IFace
{

    public void DoStuff()
    {
        ((IFace)this).SomeMethod();
    }

    void IFace.SomeMethod()
    {
    }
}

答案 2 :(得分:7)

这两个陈述没有区别......

//These are exactly the same.

this._person 

//and 

_person 

在_person的情况下隐含了对“this”的引用。我不会说它必然是“更好”的编码实践,我会说它只是偏好。

答案 3 :(得分:3)

答案 4 :(得分:3)

由于您使用下划线,因此名称之间不存在冲突;所以“this.”是多余的,可以省略。 IL将不受影响。

只要字段和变量/参数之间没有歧义,只有一种情况是this关键字(在当前实例的意义上 - 不是ctor-chaining)是绝对必要的 - 调用单独定义的扩展方法:

this.SomeExtensionMethod();  // works
SomeExtensionMethod();  // fails

答案 5 :(得分:1)

无论如何,两个构造函数在第二个构造函数中执行相同的操作this是多余的

答案 6 :(得分:0)

您可以使用它来区分名为X的局部变量和同名的类级别字段/属性。

答案 7 :(得分:0)

您不应该使用私有变量_person和_parter。这是你的吸气者和制定者的目的。

就构造而言,它们之间没有真正的区别。话虽这么说,我总是喜欢使用This关键字,因为它有助于提高可读性。