質問
可能な複製:
「この」キーワードをいつ使用しますか?
こんにちは、私はそれを理解しています 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を使用しないでください。それがあなたのゲッターとセッターの目的です。
コンストラクトに関しては、それらの間に本当の違いはありません。そうは言っても、私は常にこのキーワードを読みやすくするため、このキーワードを使用することを好みます。