【问题标题】:C# When To Use "This" Keyword [duplicate]C#何时使用“This”关键字[重复]
【发布时间】:2010-10-25 00:06:17
【问题描述】:

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

你好, 我知道This 关键字用于引用类的一个实例,但是,假设我有一个名为Life 的类,它定义了两个字段,人(他们的名字)和他们的搭档(他们的名字):

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”关键字只是更好的编码习惯?

问候

【问题讨论】:

标签: c# constructor this


【解决方案1】:

构造函数是相同的。 我更喜欢第二个的原因是它允许你从你的私有变量名中删除下划线并保留上下文(提高可理解性)。我习惯于在引用实例变量和属性时始终使用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");
    }
}

【讨论】:

  • 那么我发布的代码是一种较旧的方法吗?您发布的代码是更新的方式吗?另外.....由于您仅声明属性而不是字段,因此如何为字段设置修饰符级别?还是只是自动设置为私有?
  • 最后一个示例使用了 C#3.0 (VS2008) 中引入的自动属性。引用 C# 编程指南:“在 C# 3.0 及更高版本中,当属性访问器中不需要其他逻辑时,自动实现的属性使属性声明更加简洁。它们还使客户端代码能够在您声明属性时创建对象,如图所示在下面的示例中,编译器创建了一个私有的、匿名的支持字段,只能通过属性的 get 和 set 访问器访问。”示例省略。
  • 我觉得使用 this 关键字是多余的冗长方式,只会使代码更难阅读。什么是字段,什么是本地人应该很明显。如果没有,你需要分解一些东西,以便你有更短的方法。
  • 我搬到了另一家为私有变量指定下划线的公司。因此,我对this 的使用发生了根本性的变化。我不会再推荐它了。
【解决方案2】:

“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()
    {
    }
}

【讨论】:

  • 回复“你打败了我”;实际上,我们展示了两种不同的东西。我在调用扩展方法时展示了“this”的使用——而不是在定义扩展方法时。奇怪的是,在这种情况下“this”是必要的。
  • +1 同意“this”使代码混乱且多余。
【解决方案3】:

这两种说法没有区别……

//These are exactly the same.

this._person 

//and 

_person 

在 _person 的情况下暗示了对“this”的引用。我不会说这一定是“更好”的编码实践,我会说这只是偏好。

【讨论】:

  • 是的。两种语法都没有问题。
  • 我更喜欢下划线语法,因为它更短,就像布赖恩说的那样,下划线意味着“这个”。我要说的唯一优势是“this”的明确用户,如果有歧义问题,“this”将解决它。在这些情况下,我倾向于使用“this”作为特例来解决手头的问题。
【解决方案4】:

【讨论】:

  • +1 用于在其他人找不到时指示重复!我很惊讶这个问题还没有结束!
【解决方案5】:

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

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

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

【讨论】:

  • 啊,我现在明白了。确实很好奇。但可以理解,因为扩展方法总是与显式对象一起调用。如果没有“this”,看起来您正在调用当前类中声明的方法。仍然编译器应该能够解析这样的方法......哦,好吧
【解决方案6】:

在第二个构造函数中,两个构造函数都做同样的事情,this 是多余的

【讨论】:

    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

      您不应该使用私有变量 _person 和 _parter。这就是你的 getter 和 setter 的目的。

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

      【讨论】:

        猜你喜欢
        • 2011-01-26
        • 2011-10-10
        • 2019-11-18
        • 2010-10-09
        • 1970-01-01
        • 2019-11-20
        • 2020-06-21
        • 1970-01-01
        相关资源
        最近更新 更多