27

重複の可能性:
「this」キーワードはいつ使用しますか?

こんにちは、Thisキーワードがクラスのインスタンスを参照するために使用されていることは理解していますが、 というクラスがあるとします。このクラスでは、人物 (名前) とパートナー (名前Life)の 2 つのフィールドが定義されています。

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」キーワードを使用する方が良いコーディング方法ですか?

よろしく

4

8 に答える 8

23

コンストラクタは同じです。 私が 2 番目の方法を好む理由は、プライベート変数名からアンダースコアを削除し、コンテキストを保持できる (理解しやすくする) ためです。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または、さらに良いのですが、 with フィールドの使用については明確ではありません。

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");
    }
}
于 2009-05-09T13:17:19.480 に答える
13

「this」は、.Net 3.5 の拡張メソッドでも使用されます。

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

文字列クラスを拡張します

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

あなたの質問に答えるには: いいえ、2 つのコンストラクターに違いはありません。Imo、「this」はコードを乱雑にするため、パラメーターとフィールド変数が同じ名前の場合など、必要な場合にのみ使用する必要があります。

クラスが明示的にインターフェースを実装する場合もあります。クラス内からインターフェイス メソッドを呼び出す必要がある場合は、これをインターフェイスにキャストする必要があります。

class Impl : IFace
{

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

    void IFace.SomeMethod()
    {
    }
}
于 2009-05-09T13:26:08.550 に答える
3

アンダースコアを使用しているため、名前の間に競合はありません。そのため、" this." は冗長であり、省略できます。IL は影響を受けません。

フィールドと変数/パラメーターの間にあいまいさが存在しない限り、thisキーワードが (現在のインスタンスを意味するコンテキストで - ctor-chaining ではなく) 厳密に必要なシナリオは 1 つだけです - 定義されている拡張メソッドを呼び出す別々に:

this.SomeExtensionMethod();  // works
SomeExtensionMethod();  // fails
于 2009-05-09T13:25:55.510 に答える
3

議論済み

「this」キーワードはいつ使用しますか。

于 2009-05-09T13:19:08.840 に答える
1

this両方のコンストラクターは、冗長な2番目のコンストラクターでとにかく同じことを行います

于 2009-05-09T13:28:50.533 に答える
0

プライベート変数 _person および _parter を使用しないでください。それがゲッターとセッターの目的です。

コンストラクトに関する限り、それらの間に実際の違いはありません。そうは言っても、読みやすくするために、私は常に This キーワードを使用することを好みます。

于 2009-05-09T13:21:53.633 に答える