2011-02-02 8 views
6

静的メンバーのC#にはthisという同等の機能がありますか?静的メンバーのC#に「this」と同等のものがありますか?

私はコードを読みやすくするためにthisを使用したいが、静的メンバーに相当するものがあるかどうか疑問に思っている。

+0

ありがとうございました。この質問に対する簡単な答えは「いいえ」ですが、私の指摘は、クラスに属する静的メンバー他のクラスのメンバーで働いていますか?私の結論は、書式的には、別のクラス(前提条件であればとにかく)で作業するときにはクラス名を使用し、クラス自体ではクラス名を使用しないことが最も理想的です。私は@AakashMへの答えを迅速かつ網羅的な(または疲れた)説明に対して授与する。 :-) –

答えて

13

私はあなたがインスタンスメンバを参照していることを強化するためにthis.を使用する場合、静的メンバの等価はClassName.

を使用しますが、文体、なぜ意味を変更しないコードを追加するだろうと仮定?


様々な明確化を追加するための編集:上記

私の最後の文は、これらの例で説明することができる。比較すると

class Example1 
{ 
    public int J { get; set; } 

    public Example1() 
    { 
     J = 0; 
    } 

    // These two methods have *exactly* the same CIL 
    public int InstanceMethodLong() 
    { 
     return this.J; 
    } 

    public int InstanceMethodShort() 
    { 
     return J; 
    } 
} 

InstanceMethodLongthis.は意味を変えていませんInstanceMethodShort

静的:StaticMethodShortと比較して、StaticMethodLong

class Example2 
{ 
    public static int K { get; set; } 

    static Example2() 
    { 
     K = 0; 
    } 

    // These two methods have *exactly* the same CIL 
    public int StaticMethodLong() 
    { 
     return Example2.K; 
    } 

    public int StaticMethodShort() 
    { 
     return K; 
    } 

Example2.は意味が変更されません。

これらの両方の場合、修飾子を追加すると同じCIL(同じ動作)が得られ、書き込み、読み込み、理解するためのソースが増えます。 Stylistically - これはコードスタイルの問題だと私は喜んで受け入れる - 私はそこにいる理由はないと思う。アンダースコアの接頭辞状況に


が若干異なります。 - 私たちは意図的かつ明示的に異なる意味を表現している。ここ

class Example3 
{ 
    int _j; 

    public int J 
    { 
     get { return _j; } 
     set 
     { 
      _j = value; 
      // and do something else, 
      // to justify not using an auto-property 
     } 
    } 

    public Example3() 
    { 
     J = 0; 
    } 

    public int MethodWithParameter(int j) 
    { 
     // Now there is a *difference* between 
     return j; 

     // and 
     return _j; 
    } 
} 

MethodWithParameterで、_jjを参照するとの違いあり。コンパイラが変数名と呼ばれるものを気にしないのは当然ですが、がどの変数を参照しているかを気にしています!したがってMethodWithParameterの本文では、アンダースコアを使用するか使用しないかではなく、意味論的です。私たちがこの問題に取り組んでいる特別な問題ではありません。

+7

コードの* maintainer *に意味が変わることがあります。コンパイラはどちらか一方を気にしません。 –

+0

この型を認識できないようにする方法はありますか? (私のクラスの名前を変更したい場合) – xtofl

+0

@エリック「コードは主に人のために書かれたものであり、コンピュータのためだけに書かれています」 - 私たちは非常に滑りやすい斜面の頂上にいます。私の仲間のメンテナーがコンパイラとまったく同じ方法で私の意図を理解している場所にいることを目指す方が、私の仲間のメンテナーに不完全な理解を与えるよりも好きです。次に何が起こるのですか?「LINQを避ける人がいるので混乱しています」 – AakashM

2

クラス名を使用して、他の静的プロパティを参照することができます。

あなたのコードは、コピー/ペーストに少し抵抗がありますが、それは必ずしも悪いことではありません。

1

私は「これ」が好きで、状態が変化している最初の顔から真実を再確認します。この場合、静的メンバーの型名を考慮する必要があります。

2

残念ながら、いいえ、静的メソッドにはthisはありません。静的メンバーをクラスメンバーと区別するために、クラス名の前に接頭辞を付けます。

class Test { 
    static Regex TextRegex = new Regex(...); 

    public static bool TestString(string input) { 
    return Test.TextRegex.IsMatch(input); 
    } 
} 
3

静的メンバは、(thisは、インスタンスごとに異なる可能性設定で、オブジェクトのインスタンスを指す)任意の特定のインスタンスに属していることを意味しないと、何を代わりにしたいと思うことは代わりに使用ClassName.Memberですthis.Member

public class Orange 
{ 
    public static string Tastes = "sweet"; 

    public static string FoodType(){ 
     return "fruit"; 
    } 
} 

はによって呼び出されます:

Console.WriteLine(Orange.Tastes); 

同じだけでなく、静的メソッドのために行く:

Console.WriteLine(Orange.FoodType()). 

これが唯一のデモのために不自然な例であることに注意してください。 :)

関連する問題