2013-07-10 12 views
10

AFAIK voidは、プログラミング言語に関して何も意味しません。だからなぜ.Netフレームワークでそれはstructと宣言されていますか?.NETで戻り値の型が構造体として宣言されているのはなぜですか?

using System.Runtime.InteropServices; 

namespace System 
{ 
    /// <summary> 
    /// Specifies a return value type for a method that does not return a value. 
    /// </summary> 
    /// <filterpriority>2</filterpriority> 
    [ComVisible(true)] 
    [Serializable] 
    [StructLayout(LayoutKind.Sequential, Size = 1)] 
    public struct Void 
    { 
    } 
} 

答えて

15

System.Void効果的マーカータイプである - MethodInfo.ReturnTypeのようなメンバーがvoidを表す何らかの方法を持っている必要があり、かつSystem.Voidは、.NETチームがそうすることを選んだ方法です。

通常のタイプのように使用しないでください。これは回避策です。実質的には、F# Unit typeのように少しですが、タイプシステムに完全に統合されているわけではありません。

+0

このような素敵な答えです。サー! –

+0

回避策として使用する代わりに.netにボイドがうまく統合されていれば、より良いパフォーマンスを得られたでしょうか? –

+1

@AppDeveloper、私はそれが性能に全く影響を及ぼさないと思っています。関数のコンパイル方法や値を返すかどうかを制御するだけです。 C#Void関数、またはVB Subsは値を返さないので、スタック値をプッシュ/ポップするためのILコードは単に省略されます。 – Kratz

2

メソッドディスクリプタには、メソッドの戻り値の型のフィールドが含まれます。そのフィールドをvoidファンクションの場合にはnullとすることは可能ですが、そのコードは、例えば次のようなコードを必要とします。

string theReturnType = theMethod.ReturnType ? theMethod.ReturnType.ToString() : "null"; 

ではなく、単純に言って::

string theReturnType = theMethod.ReturnType.ToString(); 

コードは特殊なケースのヌルを有することをメソッドの戻り値の型で何かを持っている十分な場合がありますような何かを言うメソッドの戻り値の型を報告それらのすべてにおいて、返すことができるダミータイプ "ヌル"を単に持つよりもはるかに大きな問題になります。

ちなみに、voidがメソッド戻り値として使用可能な唯一の型ですが、それ以外の目的はありませんが、公開戻りに使用できる型があると便利な場合もあります(外部コードがbiz.boz(3)のメンバーにアクセスできるが、値自体を格納できない場合は、biz.boz(3).foo(9).bar(2).build()のような構文でfooメソッドを使用するなど、外部記憶場所宣言では使用されませんそれがboz(3)によって返されたオブジェクトへの唯一の参照を宇宙のどこにも保持していたことを知ることができ、その都度自由に変形したり、新しいインスタンスを返すことができます。

関連する問題