C#void type- safety
我是C#编程的新手(来自C ++)
我的问题是:在C#中,每个类型都inheritance自Object为什么’void’不会?它会导致一些RT /类型安全问题,还是只是语义/语法?
(我知道int / char等’基本类型’和使用装箱/拆箱 – 我的问题是针对void的)
谢谢
在C#中, void
是在两个上下文中使用的关键字:
-
在方法签名的上下文中,
void
表示没有返回类型; 它不引用可以从object
inheritance的类型“void”。(在reflection中,总是要指定一个返回类型。因此,框架中有一个
System.Void
类型,但void
和System.Void
不能互换使用。) -
在不安全的上下文中,
void*
是未知类型的指针类型。 正如@Colin Mackay链接的博客文章中所提到的 ,指针类型不会从object
inheritance,尽管它们可以转换为一个。
并非所有东西都从Objectinheritance – 这是一个普遍的神话。 接口不从Objectinheritance。
有关详细信息,请参阅此处 : http : //blogs.msdn.com/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx
与C ++不同,C#仅允许void关键字指定方法没有返回类型。
在C#中,void关键字作为方法参数无效。 但是,在C ++中,void可用于指定“通用”指针。
对此规则的一个警告是使用不安全的代码 ,这在C#中通常是不必要的。
编辑:与其他人发布的内容相反,void和System.Void之间存在差异。 除了struct System.Void之外,还有一个void关键字。 该关键字用于指示方法没有返回类型。 另一方面,System.Void在reflection中用于询问方法返回的类型(System.Void可能有其他用途,但我不知道任何用途)。
C#void关键字
C ++ void关键字
虚空不是一种物体。 这是一种什么都没有。 至少在C#中,使用单词void的唯一时间是函数返回类型,因此它意味着该函数不返回任何内容。 不存在的东西不能来自任何东西。 使用它的唯一其他地方是在不安全的上下文中,引用指针,它也不是从Object派生的。
Void是一个Type,但返回void的方法不会将任何东西压入堆栈。 System.Void被声明为一个struct,因此它也应该从objectinheritance,但它的处理方式不同。 在调用返回void的方法之后,如果查看IL代码,可以看到更清楚,没有pop
指令,通常用于从堆栈中弹出未使用的返回值。
编辑:其实,我检查过。 如果我声明一个方法作为返回System.Void,我收到一条错误消息,指出System.Void不能从C#代码中使用。 但请尝试以下方法:
typeof(object).IsAssignableFrom(typeof(void)) typeof(System.ValueType).IsAssignableFrom(typeof(void))
将返回true,因此void派生自object和System.ValueType(即struct)