私は前後にバウンスし続けており、最高のものに標準化したいと考えています:
private MyOtherClass mc = new MyOtherClass(); // up here OK?
public MyClass()
{
// or down here?, mc = new MyOtherClass();
}
宣言時の初期化は何時に行われますか? プログラムが最初に起動するのはいつですか?
私は前後にバウンスし続けており、最高のものに標準化したいと考えています:
private MyOtherClass mc = new MyOtherClass(); // up here OK?
public MyClass()
{
// or down here?, mc = new MyOtherClass();
}
宣言時の初期化は何時に行われますか? プログラムが最初に起動するのはいつですか?
実際の違いはほとんどありません。どちらもほぼ同じものにコンパイルされます。ほとんどの場合、コーディング スタイルによって異なります。スーパーコンストラクターが呼び出される前にフィールドが初期化されることを知っておく必要がありますが、この事実に頼るのは悪い習慣です。
コンストラクターですべてのフィールドを初期化することを好みます。これにより、フィールドが初期化される順序をより細かく制御できます。
どちらでもかまいません。実際には、好みの問題か、構築ロジックをどのように編成するかです。
コンストラクターが実行される前に、インライン値が最初に設定されることに注意してください。つまり、次の出力bar
:
public class MyClass
{
private string _member = "foo";
public string Member { get { return _member; } }
public MyClass()
{
_member = "bar";
}
}
class Program
{
static void Main(string[] args)
{
var myClass = new MyClass();
Console.WriteLine(myClass.Member);
Console.ReadLine();
}
}
私は次のように言います: これが単なるスタンドアロン クラスである場合、どこで初期化してもかまいません。このクラスがいつ基底クラスになるか、その時が問題かもしれません。具体的に言えば、実行順序の話です。最初に何かを初期化したい場合は、その初期化をコンストラクターに移動します。コンストラクターの宣言方法などに応じて、実行チェーンのさまざまなバリエーションが存在する可能性があるため、答えは、問題になる場合と問題にならない場合があります。封印されたクラスなら間違いなく問題ありません。しかし、継承が関係するとすぐに、答えは不安定になります。
あなたの投稿では、「宣言での初期化はいつ行われますか?プログラムが最初に起動されるのはいつですか?」と尋ねました。
他の答えは正しいですが、私はそれを強調したかっただけです:
private MyOtherClass mc = new MyOtherClass();
インスタンスフィールドを宣言しており、プログラムの起動時ではなく、インスタンスがインスタンス化されたときに初期化されます。
static フィールドを宣言した場合:
private static MyOtherClass mc = new MyOtherClass();
これは、型コンストラクターが実行されたときに初期化されます。これは、クラスの任意のメンバーが最初にアクセスされたときに発生します (いくつかの複雑さを除けば、Jon Skeet と Eric Lippert が私よりもうまく説明するでしょう)。
どちらの場合も、プログラムの起動時にフィールドは初期化されません。