2009-07-20 17 views

答えて

19

それはあなたが宣言時点でまたはコンストラクタを除いて、それに割り当てることができないことを意味します。メソッドにパラメーターrefまたはoutを渡すこともできません。

編集:下記のコメントに基づきます。発信者にstring.Emptyへの直接読み取りアクセスを許可するため、次のフィールドはreadonlyですが、他の人に設定する必要はありません。私はクラスのフィールドとしてList<>Dictionary<>を持っているとき

public sealed class String 
{ 
    public static readonly string Empty = ""; 
} 

また、時々、私はそのメンバーと仕事をしたいことを示すために、それreadonly宣言します(でも追加やアイテムなどを削除)実際に別のListオブジェクトやDictionaryオブジェクトを割り当てることは決してありません。

もう1つ編集:廃止予定のPath.InvalidPathCharsフィールド(備考欄にあります)を読んで、readonlyが理解できない場合に重大な問題が発生する可能性があることを確認してください。

+0

質問内の質問です。読書だけでは、フィールドで読んで良い政治的な使用は何のためのメモリを減らすことはありませんか? – pedrofernandes

+6

@ pho3nix:Erm、デザインプラクティスを強制するのはどうですか? (変数を変更しない場合は、変更しないでください!) – Noldorin

+0

クイックアンサーに感謝します。 – Chaddeus

0

readonlyは、オブジェクトをキーとして使用する場合に便利です。このキーは変更しないでください。そうしないと、アクセス権にアクセスできなくなります。

たとえば、 1)をASP.NETサイト内のイベントで使用する場合は、コントロール内のイベントコレクションを使用できます。あなたのコントロールでは、読み取り専用のオブジェクトフィールドをコレクション内のイベントハンドラを参照するようにします。 2)マルチスレッドでは、アクセスを同期させる必要があります。これは、lockステートメントをロックする読み取り専用オブジェクトと組み合わせるために行うことができます。

5

番号readonlyおよびconstは、基本的に同じ目的を果たします。つまり、実行時の値への割り当てを防ぐためです。しかし、それらは意味的に異なる用途を有する。 CONST

constフィールドは時間をコンパイルで評価され、readonlyフィールドは実行時に評価され、コンストラクタに両方初期化することができる間だけ、宣言で初期化することができる対読み取り専用

宣言サイトで。

また、フィールド値はメタデータの一部として格納されているため、それを宣言したクラスの関連コンストラクタで初期化され、readonlyフィールドは実行時に計算する必要があります。

5

はい!

はい?はい!どうやって?シンプル。読み取り専用フィールドは新しい値を取得できないため、2番目のDBRepositoryを作成してこのフィールドに割り当てることはできません。読み取り専用でない場合は、このフィールドに新しい値を再割り当てするコードを記述することができます。また、再割り当てとガベージコレクタが古い値をクリアするまでの間に、使用するメモリがもう少し増えます。さらに、DBRepositoryのクリーンアップでメモリリークが発生した場合、このフィールドに新しい値を再割り当てすると、複数のメモリリークが発生します。

このようなメモリリークが発生する可能性があります。 1)_dbに値を割り当てます。 2)_dbの値を別のフィールドに割り当てます。 3)_dbに新しい値を再割り当てします。 古いオブジェクトが別のオブジェクトから参照されているため、現時点では2つのDBRepositoryオブジェクトがメモリに格納されます。したがって、古いオブジェクトは、2番目のフィールドが解放するまで解放されません。

しかし、これは非常にニッキーであり、非常にまれです。答えは「いいえ」が適切です。間違った理由でメモリを使用するため、メモリを節約するために "ReadOnly"を使用しないでください。 "ReadOnly"を使用して、他の人がこのフィールドに値を再割り当てしないようにします。 ありませんが、良好なパフォーマンスの観点から書かれている答えが集中

0

(基本的に、私は...それはメモリ使用量を減らすことができることを言っている)コーダすでにすべてのトリックやトラップなど:

を知っています
  1. タイトなループではLINQはありません。本当に。なし。これまで
  2. 比較
  3. 前に、int型へのあなたの列挙型をキャスト値型の構造体
  4. の用心「新しい」新しいGrue
  5. ある
  6. CLRProfilerは
  7. 他のプロファイラは奇妙な場所へ
  8. を可変の建設時間を置くあなたの友達です

答えは、C#の設計の落とし穴、または「プロファイリングは悪い」クワードを飲み込んだ人には気づいていないコーダーと非常に関係しています。

私は、私たちのコードでたくさんの行列や配列を初期化します。私は怠惰な初期化に気づきました: if(variable == null) //変数= new変数(

はフロントを構成するよりパフォーマンスが低いようです。 readonlyはコンストラクタを構築する必要があるので、メモリ内のデータのローカリゼーションの利点を得ることができ、実行時に他の厄介な「ビルドと置き換え」を行うことができなくなります。 C#はガベージコレクタをひどく脅かす可能性があります。

C#を使用すると、非常に簡単に効率の悪いメモリを書き込むことができます。 mallocは私たちに割り振りを考えさせる方法でした。同じように、読み取り専用は私たちにそれを考えるように強制します。

CLRProfilerを実行すると、自分がどれくらいのメモリスパムを行ったかを確認できます。あなたがほとんど超人規律なしにHPCを書いていたなら、ヒープをスパムして読んでいる可能性があります。

つまり、HPCコードを記述していないと、早すぎる最適化がマシンアーキテクチャに関するすべての学習の根幹です。ああ、いや、待って...私は標準的な教義に従って、悪を意味した。すべてが標準教義を揺るがしません。