C# 我是否需要在ldloca和call之前将initobj/null赋值给out参数?
正如我看到的,C#compiler和C# 我是否需要在ldloca和call之前将initobj/null赋值给out参数?,c#,reflection.emit,il,C#,Reflection.emit,Il,正如我看到的,C#compiler和Reflection.Emit总是为值和引用类型变量发出.locals init(即使它们后来被无条件初始化)。因此,它们可以作为out参数传递: .maxstack 1 .locals init ( [0] object x) L_0000: ldloca.s x L_0002: call void Program::MethodWithOut(object&) L_0007: ret 是否
Reflection.Emit
总是为值和引用类型变量发出.locals init
(即使它们后来被无条件初始化)。因此,它们可以作为out参数传递:
.maxstack 1
.locals init (
[0] object x)
L_0000: ldloca.s x
L_0002: call void Program::MethodWithOut(object&)
L_0007: ret
是否存在使用
.locals
而不使用init
的情况,因此在发出call/callvirt之前,我需要确保变量已初始化?当您通过ref
传递参数时,需要在传递之前对其进行初始化。
当您通过
out
传递参数时,必须在被调用的方法内部初始化参数。简单的答案是,始终需要init
才能使代码可验证。根据§III.1.8.1.1验证算法:
此外,可验证方法应设置localsinit位[…]。如果未设置此位,则CLI可能会引发
验证
在访问局部变量的任何点以及程序集
未授予包含该方法的
SecurityPermission.SkipVerification
是的,我知道。我在问有关IL汇编规则的问题。很抱歉让人困惑,请参阅更新的问题。