2016-02-03 13 views
1

正如我看到的C#编译器和Reflection.Emit总是发出.locals init值和引用类型的变量(即使他们后来无条件地初始化)。我需要在ldloca之前先调用initobj /分配null参数吗?

.maxstack 1 
    .locals init (
     [0] object x) 
    L_0000: ldloca.s x 
    L_0002: call void Program::MethodWithOut(object&) 
    L_0007: ret 

是否有其中不init所以发射呼叫/ callvirt我需要确保该变量初始化之前使用.locals任何情况下:所以他们可以作为out参数传递?

回答

2

简单的答案是init总是需要使代码可验证。从§III.1.8.1.1验证算法的ECMA-335

此外,核查的方法应具有localsinit位集[...]。如果未设置此位,则CLI可能会在访问本地变量的任何点以及包含该方法的程序集 未被授予 SecurityPermission.SkipVerification时抛出异常 验证 。

-1

当您通过ref传递参数时,您需要在传递前初始化它们。 当您通过out传递参数时,它们必须在被调用的方法内进行初始化。

+1

是的,我知道C#。我在问IL组装规则。 – Vlad

+0

对不起,我很抱歉,请参阅最新的问题。 – Vlad

相关问题