web-dev-qa-db-ja.com

C#「これ」キーワードを使用する場合

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

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

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

よろしく

25
Goober

コンストラクタは同じです。 私が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");
    }
}
23
tvanfosson

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

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

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

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

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

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

class Impl : IFace
{

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

    void IFace.SomeMethod()
    {
    }
}
13
Peter Lillevold

2つのステートメントに違いはありません...

//These are exactly the same.

this._person 

//and 

_person 

「これ」への参照は、_personの場合に暗黙に含まれます。私はそれが必ずしも「より良い」コーディング慣行であるとは言いませんが、それは単なる好みであると言います。

7
Brian ONeil
3
Richard West

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

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

this.SomeExtensionMethod();  // works
SomeExtensionMethod();  // fails
3
Marc Gravell

どちらのコンストラクタも2番目のコンストラクタでは同じことを行いますが、thisは冗長です

1
Hannoun Yassir

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

0
Richard

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

構成要素に関しては、それらの間に実際の違いはありません。そうは言っても、可読性に役立つThisキーワードを使用することを常に好みます。

0
hmcclungiii