[英]Why is return type void declared as struct in .NET?
AFAIK 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
{
}
}
System.Void
实际上是一种标记类型 - 像MethodInfo.ReturnType
这样的成员必须有一些表示void
,而System.Void
是.NET团队选择这样做的方式。
你不应该像普通类型一样使用它。 这是一种有效的解决方法 - 有点像F# Unit
类型 ,但不完全集成到类型系统中。
方法描述符包含方法返回类型的字段。 虽然可以使该字段对于void
函数为null
,但这需要想要报告方法的返回类型的代码如下所示:
string theReturnType = theMethod.ReturnType ? theMethod.ReturnType.ToString() : "null";
而不是简单地说:
string theReturnType = theMethod.ReturnType.ToString();
有足够多的情况下,代码必须对方法的返回类型做一些事情,在所有这些方法中必须使用特殊情况null才会比仅仅返回可以返回的虚拟类型“null”更麻烦。
顺便说一下,虽然我知道void
是唯一可用于方法返回值但没有其他目的的类型,但在其他情况下,有一个类型可用于公共返回值是有用的,但不是用于外部存储位置声明,例如在编写流畅的界面时(如果允许外部代码访问biz.boz(3)
成员,但无法存储值本身,则在biz.boz(3).foo(9).bar(2).build()
等biz.boz(3).foo(9).bar(2).build()
, foo
方法可以知道它在宇宙中的任何地方都拥有boz(3)
返回的对象的唯一引用,因此可以自由地进行变异它或在方便时返回一个新实例)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.