2010-11-27 5 views
49

C#4では、オプションの出力パラメータを使用する良い方法はありますか?それは、「オプション」ようにするにオプションの出力パラメータ

+0

このような機能の値は表示されません。 PDCでC#コンパイラの人のセッションを聞いたことがあるならば、すべての変更が意味を持つことがわかります。 –

+29

私は、この機能には価値がないという意見に同意します。メソッドがいくつかのロジックを持っている場合、BESIDEはout-parametersを介してデータを返す - 私はこのロジックを呼び出すことができますが、出力は必要ありません。 – Alex

+1

私はInt32.TryParse()を使用して、指定された文字列を解析して数値に変換できるかどうかを確認します。だからJitbitは正しい。 –

答えて

5

、あなたはメソッドに値を割り当てる必要はありません意味で、あなたはrefを使用することができます。

+3

'ref'パラメータは非常に異なるユースケースです。呼び出し元がrefパラメータを指定していない場合は、オプションのパラメータが特定の値に渡されます。呼び出し元は、指定したかどうかにかかわらず常に値を指定しています。 'ref'は常に有効なメモリ位置を指し、有効なメモリ位置は常に_something_を含みます。せいぜい、これは単にデフォルト値が "X"であるというデフォルトの仕様の利点を持たない魔法の価値です。 – danwyand

+2

さて、この答えは設計上の判断ではないので、私は "その意味で"修飾子を付け加えました。 – codekaizen

48

実際には、出力パラメータを使用しない別の方法でメソッドをオーバーロードすることはできますが、実際はそうではありません。

+3

任意のパラメータを '{string dummy; Fooを返す(ダミーから); } '出力パラメータを取らないオーバーロードでは? –

+2

@ルイス:いいえ、それはおそらく私がやったことでしょう! – Cameron

+0

それは多くのボイラープレートコードを追加しています。 – Brain2000

2
private object[] Func(); 

戻り値のオブジェクト配列に必要な出力を多く割り当ててから使用してください。あなたは

private void Func(out int optional1, out string optional2) 

のようなオプションの出力何かを意味して、あなたが

Func(out i); 

のようなものを呼び出す場合 はなく、その後、答えはあなたがカントノーです。 また、C#と.NETフレームワークでは、ListArrayのような非常に柔軟性のある多くのデータ構造があり、出力パラメータまたは戻り値の型として使用できるため、オプションの出力パラメータを持つ方法を実装する必要はありません。

7

OptionalAttributeでパラメータを装飾することもできません。前のサンプルを拡張するには、次のようなものがあります。

private void Func(
    [Optional] out int optional1, 
    [Optional] out string optional2) 
{ /* ... */ } 

上記はコンパイルされます(おそらく残念ながら)。しかし、コンパイルしようとすると、1パラメータの署名を持つオーバーロードが明示的に提供されない限り、コンパイルしようとすると失敗します。

上記の作業を(理論的に)行うことは重大な問題です。省略されたオプションのパラメータを持つメソッドが呼び出されると、すべてのパラメータの値を含むスタックフレームが作成され、欠損値は指定されたデフォルト値で単純に埋められます。

ただし、「out」パラメータは値ではなく参照値です。そのパラメータがオプションで、指定されていない場合は、どの変数を参照しますか?コンパイラーは、呼び出し元によってオプションパラメータが指定されていれば、先験的なことをコンパイラーが知らないため、コンパイラーはメソッドからの通常の戻り値の前に "out"パラメーターを入れる必要があります。これは、ダミー変数の参照がどこかでのように渡されなければならないことを意味するので、メソッドには何かがあります。このダミーの変数空間を管理することは、コンパイラの作者に厄介な頭痛を引き起こします。これがどのように機能するかの詳細を理解することは不可能だと言っているわけではありませんが、アーキテクチャ上の影響はMicrosoftがこの機能を理解して渡したほど十分です。

0
public class Dummy<T> 
{ 
    public T Value; 
} 

そしてintは任意のタイプであってもよいfunctionDoSomething(out new Dummy<int>().Valueを、使用。

関連する問題