为什么返回类型void在.NET中声明为struct?

时间:2013-07-10 15:32:29

标签: c# .net vb.net clr

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
  {
  }
}

2 个答案:

答案 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)返回的对象的唯一引用,因此可以自由地改变它或返回一个新实例,方便)。