質問

可能な複製:
「この」キーワードをいつ使用しますか?

こんにちは、私はそれを理解しています 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に違いはありますか!?それとも、「この」キーワードを使用する方がコーディングの練習が良いでしょうか?

よろしく

役に立ちましたか?

解決

コンストラクターも同じです。 私が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 フィールドで。

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");
    }
}

他のヒント

「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、「この」はコードを覆い、必要なときにのみ使用する必要があります。たとえば、パラメーターとフィールド変数が同じ名前を持っている場合です。

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

class Impl : IFace
{

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

    void IFace.SomeMethod()
    {
    }
}

2つの声明に違いはありません...

//These are exactly the same.

this._person 

//and 

_person 

「これ」への参照は、_Personの場合に暗示されています。私はそれが必ずしも「より良い」コーディングの練習であるとは言いません、私はそれが単なる好みであると言うでしょう。

アンダースコアを使用しているため、名前の間に矛盾はありません。だから」this.「冗長であり、省略できます。ILは影響を受けません。

フィールドと変数/傍線の間にあいまいさがない限り、1つのシナリオしかありません。 this キーワード(現在のインスタンスを意味するコンテキストでは、CTORチェーンではなく)は厳密に必要です - 個別に定義される拡張メソッドを呼び出す:

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

どちらのコンストラクターもとにかく2番目のコンストラクターで同じことをします this 冗長です

これを使用して、xという名前のローカル変数と同じ名前のクラスレベルフィールド/プロパティを区別できます。

プライベート変数_Personと_Parterを使用しないでください。それがあなたのゲッターとセッターの目的です。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top