为什么返回类型void在.NET中被声明为结构

本文关键字:声明 结构 NET 返回类型 void 为什么 | 更新日期: 2023-09-27 18:22:00

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

为什么返回类型void在.NET中被声明为结构

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()这样的构造中,foo方法可以知道它拥有宇宙中任何地方对boz(3)返回的对象的唯一引用,因此可以随意对其进行变异或返回新实例)。