可能性のある複製:
「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」キーワードを使用するほうがよいコーディング方法ですか?
よろしく
コンストラクタは同じです。 私が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つのコンストラクターに違いはありません。イモ、「this」はコードを散らかし、必要な場合にのみ使用する必要があります。パラメータとフィールド変数の名前が同じ場合。
クラスが明示的にインターフェースを実装する場合もあります。クラス内からインターフェイスメソッドを呼び出す必要がある場合は、これをインターフェイスにキャストする必要があります。
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は影響を受けません。
フィールドと変数/パラメーターの間に曖昧さがない限り、this
キーワード(現在のインスタンスを意味するコンテキスト-ctor-chainingではない)が厳密に必要な-呼び出しのシナリオは1つだけです個別に定義される拡張メソッド:
this.SomeExtensionMethod(); // works
SomeExtensionMethod(); // fails
どちらのコンストラクタも2番目のコンストラクタでは同じことを行いますが、this
は冗長です
これを使用して、Xという名前のローカル変数と、同じ名前のクラスレベルのフィールド/プロパティを区別できます。
プライベート変数_personおよび_parterを使用しないでください。それがゲッターとセッターの目的です。
構成要素に関しては、それらの間に実際の違いはありません。そうは言っても、可読性に役立つThisキーワードを使用することを常に好みます。