1

キーワード「this」は、クラス変数内のコンストラクター外の変数を指すことを理解しています。しかし、パラメーターの名前を (string _name, string _alias) に変更するだけではどうですか?状況。

private string name;
private string alias;
   public Employee(string name, string alias) 
    {
       this.name = name;
       this.alias = alias;
    }
4

2 に答える 2

3

あなたの例では、フィールド名にアンダースコアを付けることができるので、this必要ありません(ローカル変数との衝突がない場合は推測できるため、引き続き許可されますが、必要ありません)。実際、Microsoft の標準では、そうすることを推奨しています。

thisただし、キーワードが必要な場合はまだたくさんあります。

Employee1 つの例は、次のようなを受け入れる別のクラスにユーティリティがある場合です。

public static class Utility
{
    public static void SomeMethod(Employee employee)
    {
    }
}

このユーティリティをEmployeeクラス内から呼び出したい場合は、 として呼び出す必要がありますUtility.SomeMethod(this);

また、現在のインスタンスで呼び出される拡張メソッドは、 で始まる必要がありますthis.。次の拡張メソッドがあるとします。

public static class UtilityExtensionMethods
{
    public static void SomeExtensionMethod(this Employee employee)
    {
    }
}

Employeeクラス内からこの拡張メソッドを呼び出したい場合は、として呼び出す必要がありますthis.SomeExtensionMethod();

于 2013-02-09T19:34:05.557 に答える
1

このようなケースを避けるために、プライベート メンバー変数 に名前を付けます1これには賛成/反対の議論がたくさんあります_x

private string _name;
public Employee(string name, string alias) 
{       
   // Equivalent to `this._name = name`, as _name is not shadowed
   _name = name;
}

一方、パラメーター名はパブリック コントラクトの一部であるため、パラメーターの命名には反対です2。このコントラクトはクリーンで安定している必要があり、メンバー変数名を含む内部実装によって決定されるべきではありません。_x

employeeName以前は、そのような場合のパラメーターに、aName、 などの名前を使用theAliasしていましたが、使用される人工的な修飾子が嫌いでした。プライベート変数にアンダースコアを使用できなかった場合は、アンダースコアを使用this.xし、それについてよく考えません。


1この形式が必要なのはthis、C# と変数のシャドウイングが "暗黙的" であるためです。つまり、ローカル変数/パラメーターが存在する場合はそれを参照するthis.xため、これが必要です- そしてそれはここにあります。x

private string name;
public Employee(string name, string alias) 
{
   // Re-assignes parameter to itself.
   // Does NOT assign member variable!
   name = name;
}

2名前のアンダースコアは「CLS 互換性」を損なうと思いますが、それは私にとっては問題ではなく、プライベートメンバー変数にのみこの規則を使用することで、そのような互換性のない名前を公に公開することを回避できます。

于 2013-02-09T19:29:42.347 に答える