簡體   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