2013-07-10 8 views
10

AFAIK void nic nie znaczy pod względem języka programowania. Dlaczego więc w środowisku .Net jest on zadeklarowany jako struct?Dlaczego zwracany typ void jest zadeklarowany jako struct w .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 
    { 
    } 
} 

Odpowiedz

15

System.Void jest faktycznie rodzajem marker - członkowie jak MethodInfo.ReturnType mieć trochę sposobem reprezentowania void i System.Void jest sposób zespół .NET wybrał, aby to zrobić.

Nie powinieneś używać go jak normalnego typu. Jest to rozwiązanie efektywne - trochę podobne do wersji F# Unit type, ale nie w pełni zintegrowane z systemem typu.

+0

ty za tak miłą odpowiedź sir! –

+0

jeśli void był dobrze zintegrowany z .net zamiast używać jako obejścia, czy nie dałby lepszej wydajności? –

+1

@AppDeveloper, myślę, że nie wpłynie to w ogóle na wydajność, to po prostu kontroluje sposób kompilacji funkcji i czy zwracają wartość, czy nie. Funkcje C# Void lub VB Subs po prostu nie zwracają wartości, więc kod IL dla przesuwania/popping wartości stosów dla tego jest właśnie pominięty. – Kratz

2

Deskryptor metody zawiera pole dla zwracanego typu metody. Chociaż byłoby możliwe, aby to pole było funkcjami dla void, wymagałoby to kodu, który chce np. zgłoś metoda jest typ zwracanej powiedzieć coś w stylu:

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

zamiast po prostu mówiąc:

string theReturnType = theMethod.ReturnType.ToString(); 

Istnieje wystarczająco dużo przypadków, w których kod musi coś zrobić ze sposobem za typ zwracany, że mając do specjalnego przypadku wartości null w każdym z nich byłby znacznie większy kłopot niż zwykły typ "zerowy", który można zwrócić.

Nawiasem mówiąc, o ile wiem, że void jest jedynym typem, który może być użyty dla wartości zwracanej przez metodę, ale nie dla innych celów, istnieją inne przypadki, w których przydatne byłoby posiadanie typu, który mógłby być użyty do publicznego zwrotu wartości, ale nie są używane w zewnętrznych deklaracjach przechowywania, na przykład podczas pisania płynnego interfejsu (jeśli zewnętrzny kod mógł uzyskać dostęp do elementów biz.boz(3), ale nie mógł zapisać samej wartości, to w konstrukcie takim jak biz.boz(3).foo(9).bar(2).build(), metoda foo mógł wiedzieć, że posiada jedyne odniesienie w dowolnym miejscu we wszechświecie do obiektu zwróconego przez boz(3), a zatem może dowolnie go zmutować lub zwrócić nowe wystąpienie, w dogodnym dla niego momencie).