繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM