如何理解 C# 中的 System.Void 类型?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何理解 C# 中的 System.Void 类型?相关的知识,希望对你有一定的参考价值。

咨询区

  • ordag

我知道方法声明成 void 表示不返回什么东西,但我发现在 C# 中 void 不仅仅是一个关键词,而且还是一个真实的类型。

voidSystem.Void 的别名,就像 int 的别名是 System.Int32 一样,但为什么不允许直接使用Void类型呢?我觉得在逻辑上这是没有任何问题的。

比如说:

var nothing = new System.Void();

或者

var nothing = new void();

或者

void GiveMeNothing()  
void GiveMeNothingAgain()

    return GiveMeNothing();

都是无法编译的,那请问 System.Void 到底场景在哪里呢?

回答区

  • Cheng Chen

void / System.Voidint / System.Int32 是不同的,它是一种特殊的结构体,仅用于 反射 场景中,比如下面的例子:

class Program

   public static void Main(string[] args)
   
      Type voidType = typeof(Program).GetMethod("Main").ReturnType;
   

在反射操作中,必须要有一种类型可以描述 Main 方法的返回值,这就是 System.Void 的应用场景。

  • Jon

根据 MSDN:https://docs.microsoft.com/en-us/dotnet/api/system.void?view=net-6.0 描述。

Void 结构落于 System.Reflection 命名空间,但在一般的程序开发中很少使用, Void 结构除了从 Object 上继承来的所有类型之外,无任何东西。

所以说,你没有任何理由需要在代码中像下面这样写。

var nothing = new void();
  • llewellyn falco

我们在代码中用 null 来替代 void 类型,代码如下:

public Type GetType(object o)

    var type = o == null ? typeof(void) : o.GetType();

这样就轻松实现了 空对象引用模型,也就省去了非常多的 空null 判断,非常方便,接下来就可以这么写:

GetType(o).GetProperties().Select( .....

点评区

我觉得 Cheng Chen 大佬说到点子上了,我们在反射操作中,比如要用 System.Void 来承载那些 void 类型的返回值,学习了。

以上是关于如何理解 C# 中的 System.Void 类型?的主要内容,如果未能解决你的问题,请参考以下文章

C#中的var理解

理解C#泛型原理

理解C#泛型运作原理

C#中的装箱和拆箱的简单理解

C#基础:泛型的理解和使用

深入理解C#中的IDisposable接口