1

次の 2 つのコード スニペットの違いは何ですか?

public void foo(out classA x)
{
    y = new classA();
    x = y;
}

そして2番目:

public void foo(out classA x)
{
    classA y;
    x = y;
}

2 番目のスニペットが危険であるというのは本当xですか?yfoo

一般的に「新しい」を使用する必要があるのはなぜですか?

xC++ では、2 番目のスニペットがポインターである場合、ステートメントx = yはポインターではないためコンパイルさえされないため、少し混乱してyいます。

4

4 に答える 4

4

2 番目のスニペットが

public void foo(out classA x)
{
  classA y = new classA();
  x = y;
}

あなたが書いたスニペットは、C# ではまったくコンパイルされません。y最初に割り当てる必要があります。この行は、C++ のようにスタック上に のclassA y;インスタンスを作成しません。typeclassAの変数を宣言するだけです。yclassA

コンパイル スニペットを念頭に置いoutて、ローカルで宣言および初期化されたオブジェクトに変数を割り当てることは、決して危険ではありません。を指し、割り当てられているオブジェクトclassAは、宣言/使用されている場所から範囲外になるまで、存続します。yxx

于 2011-09-19T19:34:22.853 に答える
2

あなたの混乱は、C++ では 2 番目の例がスタック割り当てオブジェクトへの参照を返すことだと思います。これは C# では起こりません。

C#での2番目の例を考えると:

public void foo(out classA x)
{
  classA y;  // Doesn't allocate an object
  x = y;
}

yとにかく、値が割り当てられないため、これはおそらくコンパイルされません。

于 2011-09-19T19:40:32.070 に答える
1

メソッドが戻るか終了する前にすべての「出力」パラメーターが定義されていない限り、コードをコンパイルできないため、危険ではありません。

于 2011-09-19T19:39:12.570 に答える
1

2 番目のスニペットが危険だというのは本当ですか [...]

C# にはありません。ローカル変数へのポインターを取得できる C や C++ などのネイティブ言語を考えています。C# では、(当然のことながら) すべてがマネージド オブジェクトへの参照です。すべてが本質的にヒープ上にあります。

于 2011-09-19T19:38:43.423 に答える