2011-02-11 3 views
1

const値はインスタンスごとに格納されますか?このようなタイプの場合

public class BlurEffect 
{ 
    public const string Name = "Blur"; 

    public int Amount {get;set;} 
} 

私はすべてのメンバー間で同じになります.Nameのようないくつかのメンバーを、持っているが、私の代わりにそれを静的にする必要がありますか?

インスタンスごとに格納したり、必要以上に多くのリソースを使用したりしないようにするだけでなく、読み取り専用にする必要があります。

最後に、私はそれのためのインスタンスへのアクセスをしたいので、私が言うことができます。

をblurEffect.Name

は、私がプライベート静的変数を返すNameプロパティを作るべきか?これが最善の方法ですか?

答えて

4

C#の定数は、実際にコンパイル時に解決されます。それらはコンパイラによって使用されているすべての値に置き換えられるので、 "変数"(Name)は結果としてコンパイルされたILに実際には存在しません。

さらに、文字列定数はinternedとなるため、使用された回数に関係なく、実行可能ファイルにロードされる「ぼかし」のコピーは1つだけです。

個人的に、私は民間のconstとパブリック変数を使用します。

public class BlurEffect 
{ 
    private const string name = "Blur"; 
    public string Name { get { return name; } } 

    public int Amount {get;set;} 
} 

これは、あなたのインスタンスベースの使用状況を取得し、まだあなたが操作することができ、単一の定数を有します。

+0

おかげが、この場合には、「名前」の静的変数のようBlurEffectタイプに対して一度だけインスタンスごとに保存したりするのでしょうか? –

+0

@ジョアン:もう少し説明するために編集しました。 constを使用すると、何度使用しても、文字列インターンテーブル内に単一の定数の文字列値が得られます。文字列はそのように特別です... –

+0

ありがとうリード、それを感謝します。 –

1

私は個人的にpublic const変数に問題を見たことがありません。ただし、後でconstを非定数に変更する必要がある場合(または、定数の値を取得したときに処理を行う必要がある場合)、バイナリAPIを破棄する必要があります。

これは、これがクラスライブラリのスコープ内にある場合、そのような変更を後で行う場合、クラスライブラリにリンクするすべてのプロジェクトを再コンパイルする必要があることを意味します。このような更新を行うためにDLLをドロップすることはできません。

+3

"const変数"は擬似語であることに注意してください。 Constsは定義上変数ではありません。 –

+0

いいですね。エリック、それについては決してありません。 "const value"と言うべきでしょうか? –

+1

@エリック...まあ、擬態語かどうかは、それは何人の人がそれを言うのか。 「クラスには一定の値が含まれています」という奇妙な音がします。 "クラスには定数変数が含まれています"ということは、少なくとも私にはありません。多分英語でこれを取るべきでしょう。 :) – Earlz

1

.NETの定数はちょっと奇妙です。定数を定義すると、コンパイラはソースコードにオブジェクト指向の規則を適用しますが、コンパイラがアセンブリを作成すると、宣言したアセンブリを含むこの定数を参照するアセンブリは、定数参照の呼び出しを置き換えますローカルアセンブリのマニフェスト(ほとんどの "リテラル"を格納する)に格納されている同じ値を参照します。したがって、定数は事実上アセンブリごとに格納され、アセンブリ内でその定数を使用するたびに「静的」です。問題は、定数を変更する場合は、定数を参照するアセンブリを再コンパイルして、他のアセンブリのマニフェストをリフレッシュする必要があることです。

個人的には、私はその値を静的として定義し、それをプロパティに公開します。これにより、値が単純に埋め込まれるのを防ぐことができ、代わりに、値を必要とする現在のAppDomainのアセンブリによって1か所から参照されるオブジェクトの静的なコピーに配置されます(基本的には、アプリケーションプールやサブドメインに関する特別な場合を除く)。

さらに詳しい情報:How Constant Are Your Constants?

関連する問題