2

私は前後にバウンスし続けており、最高のものに標準化したいと考えています:

private MyOtherClass mc = new MyOtherClass(); // up here OK?

public MyClass()
{
  // or down here?, mc = new MyOtherClass();
}

宣言時の初期化は何時に行われますか? プログラムが最初に起動するのはいつですか?

4

5 に答える 5

2

実際の違いはほとんどありません。どちらもほぼ同じものにコンパイルされます。ほとんどの場合、コーディング スタイルによって異なります。スーパーコンストラクターが呼び出される前にフィールドが初期化されることを知っておく必要がありますが、この事実に頼るのは悪い習慣です。

コンストラクターですべてのフィールドを初期化することを好みます。これにより、フィールドが初期化される順序をより細かく制御できます。

于 2013-04-12T21:48:30.373 に答える
1

どちらでもかまいません。実際には、好みの問題か、構築ロジックをどのように編成するかです。

コンストラクターが実行される前に、インライン値が最初に設定されることに注意してください。つまり、次の出力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();
    }
}
于 2013-04-12T21:51:28.733 に答える
0

私は次のように言います: これが単なるスタンドアロン クラスである場合、どこで初期化してもかまいません。このクラスがいつ基底クラスになるか、その時が問題かもしれません。具体的に言えば、実行順序の話です。最初に何かを初期化したい場合は、その初期化をコンストラクターに移動します。コンストラクターの宣言方法などに応じて、実行チェーンのさまざまなバリエーションが存在する可能性があるため、答えは、問題になる場合と問題にならない場合があります。封印されたクラスなら間違いなく問題ありません。しかし、継承が関係するとすぐに、答えは不安定になります。

于 2013-04-12T22:34:16.100 に答える
0

あなたの投稿では、「宣言での初期化はいつ行われますか?プログラムが最初に起動されるのはいつですか?」と尋ねました。

他の答えは正しいですが、私はそれを強調したかっただけです:

private MyOtherClass mc = new MyOtherClass();

インスタンスフィールドを宣言しており、プログラムの起動時ではなく、インスタンスがインスタンス化されたときに初期化されます。

static フィールドを宣言した場合:

private static MyOtherClass mc = new MyOtherClass();

これは、型コンストラクターが実行されたときに初期化されます。これは、クラスの任意のメンバーが最初にアクセスされたときに発生します (いくつかの複雑さを除けば、Jon Skeet と Eric Lippert が私よりもうまく説明するでしょう)。

どちらの場合も、プログラムの起動時にフィールドは初期化されません。

于 2013-04-12T22:26:58.867 に答える