2012-07-16 7 views
22

私は、Microsoft .NET Frameworkではvoidの戻り値が構造体であることを認識しました。どうして?なぜ空構造ですか?

... 
public void TestMethod() 
{ 

} 
... 
+2

私は、[void](http://msdn.microsoft.com/en-us/library/yah0tteb(v=80).aspx)キーワードと[System.Void]( http://msdn.microsoft.com/en-us/library/system.void.aspx)Reflectionで使用される構造体。 – Strelok

+6

実際、ここでの重要なポイントは:voidメソッド**は(ILの意味で)何も返しません。そのようなメソッドから返された値を読み込んだり、 "ポップ"しようとするILを書いた場合、CLI(とPEVerify)はあなたがスタックを癖にしたことを伝えます。 –

+0

Rxデザイナーは、[Unit'](http://msdn.microsoft.com/en-us/library/system.reactive.unit(v = v103))のための構造体も用意しました。価値。可能であれば、「無効」と並んでいる可能性があります。 – ligos

答えて

28

フレームワークは、リフレクションで使用するためvoid戻り型キーワードを表すためにa value type called System.Voidを使用します。 voidは戻り値がないことを意味しますが、技術的にはまだ型ですが、コードで表現するためには構造体(値型)またはクラス(参照型)のいずれかでなければなりません。

例としてMethodInfo.ReturnTypeを参照してください。

フレームワーク設計者が構造体を構造化してクラスを作成しないようにしたのは、だれかが推測するものですが、最初は型で表現する必要があります。私は、他の最適化の中でも、通常参照参照に関連する不要なオーバーヘッドを回避するというコメントに同意します。

+17

「ベストな推測」は、0バイトを返すものとしてできるだけ近くでコードを調べることを望んでいたことです。フィールドを持たない構造体は0バイトです。クラス参照は4または8です。重要なのは、ILレベルでは明らかに何も返さず、これらの0バイトを "ポップ"しようとするとIL検証に失敗します。 –

+0

追加読書: http://ahuwanya.net/blog/post/Exploring-SystemVoid-Part-I.aspx http://ahuwanya.net/blog/post/Exploring-SystemVoid-Part-II.aspx – Strelok

+0

興味深いことに私は参照元のどこでも 'struct Void'の実際の宣言を見つけることができません。通常、ソースコメントでこれらの種類のものについて少し説明します。 –

関連する問題