19

かなり簡単です。MSDN は、ref を使用できると述べていますが、部分メソッドには out を使用できません。理由が知りたいのですが?コードがコンパイルされるとパーシャルがマージされるというのが私の理解でした。partialコード ファイルを整理して整理する (つまり、見栄えを良くする) 以上のことはありますか?

参照: MSDN の記事- 「部分メソッドにはrefを指定できますが、 outパラメーターは指定できません。」

4

7 に答える 7

21

部分メソッドが実装されていない場合にどうなるかを検討する必要があります。

その場合、メソッドへのすべての呼び出しが、まるで起こらなかったかのように取り除かれます。

したがって、out を使用するメソッドの場合、次のようになります。

stream s;
GetStream(out s);
s.Write(...);

そして、次のようにコンパイルされます。

stream s;
s.Write(...);

が初期化されていないため、このコードは使用できませsん。メソッドを呼び出そうとするまでに変数が初期化されるという保証は、 へWriteの呼び出しと結びついていましたGetStream

データを返すメソッドと同じです。部分メソッドを実装していない場合、メソッド呼び出し全体がコンパイルされないため、できることとできないことを検討し、それを呼び出すコードを有効のままにしておく必要があります。および戻り値に関してはout、呼び出しコードが無効または不完全になる可能性があるため、許可されていません。

に関してはref、呼び出し元のコードによって初期化が処理されているため、これは有効です。

stream s = null;
GetStream(ref s); // may be stripped out
if (s != null)
    s.Write(...);
于 2010-08-10T20:40:33.810 に答える
9

ref パラメーターとは異なり、out パラメーターはメソッドが戻る前に初期化する必要があるためです。部分メソッドが実装されていない場合 (これは有効なシナリオです)、どのように初期化できますか?

于 2010-08-10T20:39:00.003 に答える
4

私の推測では、パラメーターは初期化する必要がありますが、パラメーターはout初期化する必要がないためrefです。

部分メソッドでパラメーターを使用した場合out、パラメーターが初期化されているかどうかを C# で確認するにはどうすればよいでしょうか?

于 2010-08-10T20:39:39.557 に答える
4

パラメーターは、メソッドから値が必要であるoutことを示唆しています。メソッドが存在しない場合、その値を提供することはできません。

別の方法は、メソッド呼び出しを実行する代わりに、変数の値を明示的にデフォルト値 (0、null など) に設定することです。そうすれば、変数は確実に初期化されますが、デフォルト値はあまり役に立たないかもしれません。C# チームはこれを検討したと思います。将来のバージョンにそれが組み込まれる可能性さえあります。個人的には特に役立つとは思いませんが、可能性はあります。

現時点では、代わりにいつでもrefパラメーターを使用でき、デフォルト値が何であれ、呼び出しの前に変数を手動で初期化するだけです。

于 2010-08-10T20:39:58.783 に答える
1

他の誰もが述べているように、outパラメータを割り当てる必要があります。これを追加するには、コンパイラエラーCS0177 refが生成されますが、呼び出しを行う前にCS0177を割り当てる必要があります。

于 2010-08-10T20:55:03.350 に答える
1

その理由は、署名のみ (つまり実装なし) の部分メソッドがまだ有効であるためだと思います。out パラメーターがある場合、実装のないメソッドは常にエラーを引き起こします (out 値を割り当てるものがないため)。

于 2010-08-10T20:41:06.190 に答える
1

部分メソッドは部分クラスに分割されます。OUT パラメータに値を割り当てるにはメソッドが必要です。部分的なメソッドが実装されている場合と実装されていない場合があります。これは、複数のコード チャンクが OUT パラメータに値を代入しようとしていることを意味します。

于 2010-08-10T20:41:22.107 に答える