什么都不返回或返回void - C#在void Function()调用结束时究竟做了什么?

RLH*_*RLH 3 c# void void-pointers

考虑以下C#函数:

void DoWork()
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

C#文档说明:

当用作方法的返回类型时,void指定该方法不返回值.

这似乎是直截了当的,在大多数情况下,这适合作为公平的定义.

但是,对于许多较低级别的语言(即C),"void"具有略微不同的含义.具体来说,所有代码块都必须返回一些内容.因此,void是空指针的表示,它是"无"的表示.在这种情况下,您不需要return在代码中包含语句,因为任何不返回值的块语句都会自动返回空指针.

这是C#所做的,或者当一个void函数被调用时,它是否执行一段代码并返回,甚至没有包含值为void的指针?

Ree*_*sey 5

首先,C#被编译成IL,因此JIT后的最终表示可能会有所不同.

使用void方法,IL中的方法签名将标记为void,并且ret操作码仍将存在.这意味着,从IL的角度来看,调用堆栈上的"返回"值可能存在也可能不存在,但它永远不会被复制并在调用站点上使用.该ret如果存在操作码将只推一个返回值,这在一个存在不要求void返回的方法,所以在很多情况下,它不会返回任何东西,即使在低层次概念的立场.

但是,对于许多较低级别的语言(即C),"void"具有略微不同的含义.具体来说,所有代码块都必须返回一些内容.

CLR中的情况并非如此.void方法可以真正返回任何内容,因为ret操作码不允许返回任何内容.见OpCodes.Ret:

从当前方法返回,将返回值(如果存在)从被调用者的评估堆栈推送到调用者的评估堆栈.