11

私の知る限り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
  {
  }
}
4

2 に答える 2

16

System.Voidは事実上、マーカー タイプです。メンバーは、を表す何らかのMethodInfo.ReturnType方法を持っている必要があり、.NET チームが選択した方法です。voidSystem.Void

通常のタイプのように使用しないでください。これは効果的な回避策です。F#のUnittypeに少し似ていますが、型システムに完全に統合されているわけではありません。

于 2013-07-10T15:35:00.930 に答える
3

メソッド記述子には、メソッドの戻り値の型のフィールドが含まれています。そのフィールドnullvoid関数用にすることは可能ですが、それには、たとえばメソッドの戻り値の型を報告したいコードが次のように言う必要があります。

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 に答える