19


5

C#部分メソッドでrefを使用できますが、outは使用できないのはなぜですか?

かなり簡単です。 MSDNでは、refは使用できますが、部分的なメソッドには使用できないと述べています。 私は_why_について興味がありますか? コードがコンパイルされると、パーシャルがマージされるので、制限はどうなっているのか、私の理解でしたか? コードファイルをきれいに整理するだけでなく、「部分的」なものもあります(つまり、 目の保養)?

参照:http://msdn.microsoft.com/en-us/library/wa80x488.aspx[MSDN記事]-「部分メソッドはhttp://msdn.microsoft.com/en-us/library/14akc2c7.aspxを持つことができます[参照]が、http://msdn.microsoft.com/en-us/library/t3c3bfhx.aspx [out]パラメーターではありません。」

7 Answer


20


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

その場合、メソッドへのすべての呼び出しは、発生したことがないかのように削除されます。

したがって、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(...);


9


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


4


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

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


4


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

別の方法は、メソッド呼び出しを実行する代わりに、変数の値をデフォルト値(0、nullなど)に明示的に設定することです。 そうすれば、変数はまだ完全に初期化されます-ただし、デフォルト値はそれほど便利な値ではないかもしれません。 私はC#チームがこれを考慮したと信じています-それは将来のバージョンになるかもしれません、誰が知っていますか? 個人的には、それが特に役立つとは思いませんが、可能性はあります。

今のところ、代わりに `ref`パラメータを常に使用し、デフォルト値を呼び出す前に変数を手動で初期化することができます。


1


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


1


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


1


他の誰もが述べたように、「out」パラメータを割り当てる必要があります。 これを追加するには、コンパイラエラーhttp://msdn.microsoft.com/en-us/library/8fzd768w(VS.80).aspx[CS0177]を呼び出す前に、「ref」を割り当てる必要があります。