2013-07-10 155 views
10

AFAIK void在编程语言方面没有任何意义。那么为什么在.Net框架中它被声明为struct为什么返回类型void在.NET中声明为struct?

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

ty这么好的答案先生! –

+0

如果void已经很好地集成到.net中,而不是用作解决方法,它会不会提供更好的性能? –

+1

@AppDeveloper,我认为它不会影响性能,它真的只是控制函数如何编译,以及它们是否返回值。 C#无效函数或VB子只是不返回值,所以用于推送/弹出堆栈值的IL代码只是省略。 – Kratz

2

方法描述符包含方法返回类型的字段。虽然对于void函数可能有该字段为null,但这需要那些希望例如报告方法的返回类型这样说:

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

,而不是简单地说:

string theReturnType = theMethod.ReturnType.ToString(); 

有足够的情况下,代码必须与方法的返回类型的东西,有特殊情况的空在所有这些方面都会比仅仅具有可以返回的虚拟类型“null”更加麻烦。

顺便说一句,尽管据我所知void是唯一可用于方法返回值但没有其他目的的类型,但在其他情况下,有一种类型可用于公开返回值,但不在外部存储位置声明中使用,例如在编写流畅接口时(如果外部代码可以访问biz.boz(3)的成员,但不能存储该值本身,那么在biz.boz(3).foo(9).bar(2).build()foo方法可以知道它在宇宙中的任何地方对boz(3)返回的对象持有唯一的参考,并且因此可以在其方便的时候自由地对其进行变异或返回新的实例)。

相关问题