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
{
}
}
答案 0 :(得分:16)
System.Void
实际上是一种标记类型 - 像MethodInfo.ReturnType
这样的成员必须有一些方式来表示void
,而System.Void
就是这种方式.NET团队选择这样做。
您不应该像普通类型那样使用它。这是一种有效的解决方法 - 有点像F# Unit
type,但不完全集成到类型系统中。
答案 1 :(得分:3)
方法描述符包含方法返回类型的字段。虽然可以将该字段设为null
void
个字段,但这需要具有以下功能的代码:报告方法的返回类型如下:
string theReturnType = theMethod.ReturnType ? theMethod.ReturnType.ToString() : "null";
而不是简单地说:
string theReturnType = theMethod.ReturnType.ToString();
有足够的情况下,代码必须对方法的返回类型执行某些操作,在所有这些方法中必须使用特殊情况null才会比仅返回虚拟类型“null”更加麻烦。< / p>
顺便提一下,虽然据我所知void
是唯一可用于方法返回值但没有其他目的的类型,但在其他情况下,有一个可以使用的类型会很有用对于公共返回值,但不在外部存储位置声明中使用,例如在编写流畅的接口时(如果允许外部代码访问biz.boz(3)
的成员,但无法存储值本身,则在类似于biz.boz(3).foo(9).bar(2).build()
的构造,foo
方法可以知道它在宇宙中的任何位置都保存了boz(3)
返回的对象的唯一引用,因此可以自由地改变它或返回一个新实例,方便)。