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).
ty za tak miłą odpowiedź sir! –
jeśli void był dobrze zintegrowany z .net zamiast używać jako obejścia, czy nie dałby lepszej wydajności? –
@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