9

属性の下System.Runtime.InteropServicesに存在します。<Out()>しかし、それは何のためですか?次の例を回答のベースとして使用していただければ幸いです。

 Shared Sub Add(ByVal x As Integer, ByVal y As Integer, <Out()> ByRef Result As Integer)
  Result = x + y
 End Sub
4

5 に答える 5

8

その属性の目的は 2 つあります。

  • 変数の初期化を強制するかどうかに関係なく、呼び出しサイトの処理
  • マーシャリング

C#、または同様のセマンティクスを持つ同様の言語からそのメソッドを呼び出す場合、そのようなパラメーターは初期値を必要としないことがコンパイラーに認識されます。

言い換えれば、これを行うことができます:

int a;
CallSomeMethodWithOutParameter(out a);

aコンパイラは、呼び出しを行う前に が既に値を持っていることを確認する必要がないことを認識しています。

一方、属性がない場合は、C# で次のものが必要になります。

int a = 0;                               // <-- notice initialization here
CallSomeMethodWithOutParameter(ref a);   // <-- and ref here

もう 1 つの目的は、たとえば P/Invoke を介して別の呼び出しコンテキスト、別のアプリ ドメイン、または Web サービスにマーシャリングされるメソッド呼び出しで、問題のパラメーターに値が含まれることをマーシャリング ルーチンに通知することです。ただし、メソッドを呼び出すときにメソッドに値を渡す必要はありません。

これは、パラメーターと戻り値をパッケージ化して、実際の呼び出しが行われるリモートの場所に転送する必要がある場合に違いを生む可能性があります。

つまり、P/Invoke を介して使用されるメソッド呼び出しで指定した場合、メソッドが呼び出されたときに既存のパラメーター値のマーシャリングは行われませんが、メソッドが返されたときにその値が呼び出し元のコードに戻されます。 .

この最適化は、使用するかどうかはマーシャリング ルーチン次第であることに注意してください。これらは実装の詳細です。属性は、それを行うことができるパラメーターをルーチンに伝えるだけであり、常に従う命令ではありません。

于 2011-01-24T11:38:29.910 に答える
3

これは、パラメーターが C# によって "out" パラメーターとして認識されることを意味します。その場合、C# コンパイラは次のことを想定します。

  • 参照によって渡される変数の既存の値は無関係であるため、明確な代入は重要ではありません
  • 変数には、例外がない限り、メソッドが戻るまでに適切な値が割り当てられているため、ステートメントの最後で確実に割り当てられます。

もちろん、他の言語では[Out]属性をさまざまな方法で使用することを選択できますが、そのような解釈が最も自然な解釈です。基本的には、パラメーターは追加の戻り値のようなものです。(もちろん、さまざまな程度の微妙な違いがたくさんありますが、それが出力パラメーターの一般的な感覚です。)

于 2011-01-24T11:34:28.353 に答える
2

ComVisibleタイプで使用され、生成されたCOMタイプライブラリが[out]属性でパラメータを装飾する必要があることを示します。

于 2011-01-24T14:29:54.123 に答える
0

メソッドパラメータと戻り値に適用する場合、この属性はマーシャリングの方向を制御するため、方向属性と呼ばれます。[OutAttribute]復帰時に呼び出し先から呼び出し元にマーシャリングするようにCLRに指示します。呼び出し元と呼び出し先の両方が、アンマネージコードまたはマネージコードのいずれかになります。たとえば、P / Invoke呼び出しでは、マネージコードはアンマネージコードを呼び出しています。ただし、逆P / Invokeでは、アンマネージコードが関数ポインターを介してマネージコードを呼び出す可能性があります。

[OutAttribute]無視される場合があります。たとえば、[OutAttribute]int意味がないため[OutAttribute]、CLRでは単に無視されます。[OutAttribute]文字列は不変であるため、同じことが文字列にも当てはまります。

したがって、あなたの例では、この属性には意味がありません。この属性と相関<In()>属性の詳細については、こちらをご覧ください

于 2011-01-24T15:25:13.247 に答える
0

VBについてはわかりませんが、C#のoutキーワードと同等であると仮定します。

これは同じように動作しますが、関数が変数を読み取らないため、呼び出し元がパラメーターrefに渡された変数を初期化する必要はありません。out

また、COMまたはp-invokeを使用すると、マーシャリングに影響を与える可能性があります。

于 2011-01-24T11:33:48.087 に答える