咨询区
ordag
我知道方法声明成 void
表示不返回什么东西,但我发现在 C# 中 void
不仅仅是一个关键词,而且还是一个真实的类型。
void
是 System.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.Void
和 int / 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 类型的返回值,学习了。