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();
中身が変わっていない…。