11

就编程语言而言, AFAIKvoid毫无意义。那么为什么在.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
  {
  }
}
4

2 回答 2

16

System.Void实际上是一种标记类型 - 成员MethodInfo.ReturnType必须有某种表示方式void,并且System.Void是 .NET 团队选择这样做的方式。

你不应该像普通类型一样使用它。这是一种有效的解决方法 - 有点像F# Unittype,但没​​有完全集成到类型系统中。

于 2013-07-10T15:35:00.930 回答
3

方法描述符包含方法返回类型的字段。虽然可以将该字段null用于void函数,但这将要求想要报告方法的返回类型的代码说如下:

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),因此可以自由地对其进行变异或返回一个新实例,在方便时)。

于 2013-07-10T15:50:58.587 回答