2011-01-07 6 views
8

C#でクラスを書くときは、コンストラクタ内でのみ割り当てられていて、他の場所では変更されない場合は、プライベートな読み取り専用としてすべてのプライベートメンバー変数をマークすることをお勧めしますクラス?それとも、この過剰なのですか?C#クラスと読み取り専用のメンバー

+0

すべてのコメントありがとうございます。私は先に進んで私のメンバーを読書だけにします。乾杯。 – Bobbo

答えて

10

はい、個人的には良いアイデアだと思います。私は可能な限り型を変えないようにしようとしています。変数を宣言すると、readonlyは良いです開始です。すべてのものではありません。もちろん、その変数が変更可能なもの(例:StringBuilderまたは配列)であれば、それほど大きな助けにはなりません。私は変数を読み取り専用にしていますが、変数自体の値を変更したくないということを明らかにし、同じクラスの他の場所、おそらく数か月後に誤ってやってしまうのを防ぐためです。

+0

あなたはJavaとC#の両方の指導者です。これは本質的にこのJavaの質問に相当するC#です。 http://stackoverflow.com/questions/137868/using-final-modifier-whenever-applicable-in-java ここでの議論は、Javaのものよりもずっとおしゃれなように思えます。 – RAY

+0

@RAY:いいえ、Javaの 'final'は変数だけでなく、C#で' readonly'と 'sealed'を組み合わせたものです。もしあなたがクラスを封印するべきかどうか、あなたはもっと熱心な議論を見るでしょう... –

+0

真。リンクされた質問は特にローカルとクラスの変数(引数とフィールド)について質問します... – RAY

4

はい、これは具体的にはreadonlyの意味です。他の場所に割り当てないことが既に分かっている場合(または少なくとも想定している場合)は、readonlyというマークを付けることをお勧めします。結局のところ、を削除すると、後で追加するよりもreadonlyのほうが簡単です。

0

はい - 後で値を変更する際に、読み取り専用であることを知らない他の開発者が作成したコードで問題に遭遇することはありません。

1

どのような良い質問と純粋に意見で答えるつもりです。私の意見は、私は常に変数へのプロパティを作成することです。その一例を以下に示す。

private int _myInt; 
private int myInt {get{return _myInt;}} 
+4

それでも、変数はクラス内で突然変異することができます - それは開発者の意図を示すものではありません。方法。 –

-1

変数を一度しか初期化せずに書き込むことができない場合は、constにします。

http://en.csharp-online.net/const,_static_and_readonly

+1

値がコンパイル時定数でない場合、またはインスタンスフィールドの場合はconstにすることはできません。 –

+0

私はコンパイル時にconstがより効率的だと考えています。メンバがconstにできない場合は、readonlyのような別のルートが必要になります。さもなければ、私はそれをconstにします。 –

+4

正しいタイプのものであっても、それをconstにするのは悪い考えかもしれません。たとえば、 "VersionNumber"というintフィールドがあるとします。それを読み込み専用にしないでください。バージョン番号は時間の経過とともに論理的に変化する量であるため、*定数*ではありません。 *変更したことのないものに対してのみconstを使用し、πの値や鉛の原子数のように*は決して変更しません。 –

0

読み取り専用あなたは、コンストラクタを介してサービスの参照を渡す状況で非常に理にかなっていますので、すなわち

public class MyViewModel { private readonly MyContext context; public MyViewModel(MyContext context) { this.context = context; } }

あなたは明らか、あなたのコンテキストが別のもので上書きしたくありませんクラス内のその特定のサービスに依存している多くのものを持つことができます。そして、それがコンストラクタパラメータであれば、通常、オブジェクトの有効な状態を作成して保持するために、その特定のサービスまたはオブジェクトに対してRELYを意味します。読み込み専用はそのことの良い指標です。プロパティにプライベートセットがあるということは、クラス外でそれを変更できないことを意味します。リードオンリーは、物事をより安全かつ理解しやすくするための追加の制約です。

関連する問題