2011-07-29 3 views
13

コンパイラは、この不満とき、私は穏やかに驚いた:クラスインスタンスのconstを読み取れませんか?

public class UsefulClass 
{ 
    public const String RatingName = @"Ratings\rating"; 
} 

public class OtherClass 
{ 
    public void SomeFunc() 
    { 
     UsefulClass useful = new UsefulClass(); 
     String rating = useful.RatingName; 
    } 
} 

コンパイラは「静的メンバーは、インスタンス参照してアクセスすることはできません。代わりに型名とそれを修飾する」、と言う

をこのISN問題は、String rating = UsefulClass.RatingName;うまく動作します。私はちょうど思考がこれの背後にあるのは興味がありますか?私はそれに公開定数を持つパブリッククラスのインスタンスを持っている、なぜ私はこのようにデータを取得できないのですか?

+2

http://en.wikipedia.org/wiki/Uniform_access_principleに深刻な違反を犯す恐れのある言語の設計です...その理由はなく、既存のコードに影響を与えずに修正することができます。 –

答えて

25

定数はインスタンスメンバーではないため、それらはそれぞれのタイプに静的にバインドされています。インスタンスを使用して静的メソッドを呼び出すのと同じ方法で、インスタンスを使用してクラス定数にアクセスすることはできません。

タイプを直接認識せずにインスタンスを解除する必要がある場合は、そのタイプに基づいたリフレクションで行うことができます。

変更できないがインスタンスに関係するメンバーを追加しようとしている場合は、代わりに読み取り専用フィールドまたはプロパティを使用することをお勧めします。

+2

ゲッターで定数をラップすることもできます。 –

+1

@BoltClock、UsefulClassの中に 'String something = this.RatingName'でポイントをテストしようとしましたが、あなたの答えと一貫して同じエラーが出ました。私はいつも 'String something = RatingName'がインスタンスを見ていると仮定しましたが、今はstaticのClass.Variable記述を使用しています。 – TomDestry

+0

@TomDestry:そうです、ちょうど 'this.StaticMethod()'ではなく 'StaticMethod()'を使ってクラス独自の静的メソッドを呼び出すのと同じです。 – BoltClock

10

constとマークされた「変数」は、インスタンスメンバーではなくコンパイル時の構成です。あなたは、静的変数のだろう、あなたのようにアクセスすることができます言われていること

public void SomeFunc() 
{ 
    UsefulClass useful = new UsefulClass(); 
    String rating = UsefulClass.RatingName; // Access as if static 
} 

は、あなたが説明するように使用するためのものだならば、私は個人的にそうように、プロパティにこれをラップします:

public class UsefulClass 
{ 
    private const string ratingName = @"Ratings\rating"; 

    public string RatingName { get { return ratingName; } } 
} 

をこれは文法の仕事をしますが、あなたの定数を公に公開することはないので、より良いデザインのIMOでも構いません。

+0

私はそれをgetterでラップする計画に同意しませんが(間違っています)、最初は正解を提供しています(私はあなたに投票しました)。 –

+0

@ oonSilk、なぜ間違っていますか? – TomDestry

+0

@ Noon Silk:データがインスタンス**(RatingName)に関連付けられる必要がある場合、これは間違っていないことをお勧めします。これはOPがどのようにそれを示したかです。その場合、インスタンスレベルのデータであり、常に定数を返す場合でもプロパティにラップする必要があります。これは、「定数」性質を型自体の実装の詳細にします。 –

-2

constのc#は暗黙的に静的型であるためです。また、静的メンバーはクラスメンバーでのみアクセスでき、インスタンスではアクセスできないため、constではアクセスできません。

+1

あなたはすでに提供されている回答をどのように改善しますか? –

関連する問題