投稿数 - 437, コメント - 59540, トラックバック - 156

readonly

internal, sealed に続いてキーワードネタ。
public sealed class ClassA
{
 private readonly string _text;
 public ClassA( string text )
 {
  _text = text;
 }
 public string Text
 {
  get{ return _text; }
 }
}

コンストラクタで設定して、以後読み出ししかされないフィールド。readonly を付けておくと安心できる。しかし、internal sealed でも述べた通り、律儀に使用している人はあまりいないのかも。

次のような場合は必ず使いたい。

public sealed class ClassACollection : CollectionBase
{
 …
}
public sealed class ClassB
{
 private readonly ClassACollection _classAs;
 public ClassB()
 {
  _classAs = new ClassACollection();
 }
 public ClassACollection ClassAs
 {
  get{ return _classAs; }
 }
}
フィールドとして保持しているコレクション類を外部に公開するときは必ず読み取り専用だ。(MSDN のガイドラインのどっかにも書いてあった)
ClassB classB = new ClassB();
classB.ClassAs = new ClassACollection();

こんな事ができると、使いにくいクラスになってしまう。
クラス内部でも参照先を変えたくないので readonly だ。

コレクションをプロパティにすると言えば、

public sealed class ClassB
{
 private readonly ArrayList _classAs;
 public ClassB()
 {
  _classAs = new ArrayList(10); // クラスのどっかで値を入れる。
 }
 public ClassA[] ClassAs
 {
  get{ return ( ClassA[] )_classAs.ToArray( typeof( ClassA ) ); }
 }
}
これも意外にやりがちだ。
ClassB classB = new ClassB();
classB.ClassAs[ 0 ] = new ClassA();
中身が変わっていない…。

投稿日時 : 2005年11月16日 23:24

フィードバック

# re: readonly

特に、Item インデクサには必ずつけるように布教したいですね。
2005/11/17 12:03 | じゃんぬ

# re: readonly

一緒に布教活動しましょう~!
2005/11/17 12:46 | 囚人

コメントの投稿

タイトル
名前
URL
コメント