クラスを設計するとき、クラスフィールドの初期化に関するガイドラインはありますか?初期化には2つの別々の方法があります。インラインフィールド初期化子を使用することも、コンストラクターで初期化することもできます。さらに興味深いことに、静的フィールドが導入されると、定義時にフィールドを初期化できるか、静的コンストラクター、またはフィールドが既に設定されているかどうかを確認するインスタンスコンストラクターでフィールドを初期化できます。工場が導入されると、これはさらに混乱します。
例1-インライン初期化
public class ExampleOne
{
private readonly IDictionary _collection = new Dictionary();
...
}
例2-コンストラクタの初期化
public class ExampleTwo
{
private readonly IDictionary _collection;
public ExampleTwo()
{
_collection = new Dictionary();
}
...
}
例3-静的インライン初期化
public class ExampleThree
{
private static readonly IDictionary __collection = new Dictionary();
...
}
例4-静的コンストラクタの初期化
public class ExampleFour
{
private static IDictionary __collection;
static ExampleFour()
{
_collection = new Dictionary();
}
...
}
例5-静的/インスタンスコンストラクターミックスの初期化
public class ExampleFive
{
private static readonly IDictionary __collection;
private static IDictionary __anotherCollection;
static ExampleFive()
{
_collection = new Dictionary();
}
public ExampleFive()
{
if( __anotherCollection == null )
{
__anotherCollection = new Dictionary();
}
}
...
}
例6-ファクトリメソッド
public class ExampleSix
{
private static readonly IDictionary __collection;
private static IDictionary __anotherCollection;
static ExampleSix()
{
_collection = new Dictionary();
}
public static ExampleSix Create()
{
if( __anotherCollection == null )
{
__anotherCollection = new Dictionary();
}
var example = new ExampleSix();
return example;
}
...
}
現在、私が持っているクラスはこれらすべてを混ぜる傾向があります。インスタンスコンストラクターで静的フィールドを設定することは避けようとしましたが。
例7-混合
public class ExampleSeven
{
private static readonly IDictionary __collection = new Dictionary();
private static readonly IDictionary __anotherCollection;
private static readonly IDictionary __thirdCollection;
private static IDictionary __fourthCollection;
static ExampleSeven()
{
__anotherCollection = new Dictionary();
}
public ExampleSeven()
{
if( __thirdCollection == null )
{
__thirdCollection = new Dictionary();
}
}
public static ExampleSeven Create()
{
if( __fourthCollection == null )
{
__fourthCollection = new Dictionary();
}
var example = new ExampleSeven();
return example;
}
...
}
例に見られるように、単純なプリミティブではなくクラスオブジェクトであるフィールドにもっと関心があります。宣言されたときにフィールドを初期化すると、クラスがとしてマークされるbeforeinit
こと、および宣言されたときに初期化されたフィールドに渡すことができないという事実を理解していthis
ます。私の懸念は、主に上記の7つの例と同様の場合です。このように混合することで、予期しない問題に備えることができますか?