我知道这一点 拳击和拆箱相对昂贵 在性能方面。我想知道的是:

是否将值类型传递给方法的 out 参数导致变量的拳击/拆箱(因此是性能命中)?编译器可以优化它吗?

  int number;
  bool result = Int32.TryParse(value, out number);
有帮助吗?

解决方案

正如其他人指出的那样,这里没有拳击。当您将变量作为与out或ref参数相对应的参数时,您正在做的是 使变量别名. 。你什么都没做 价值 变量。您正在制作两个变量代表相同的存储位置。

拳击仅在将值类型的值转换为参考类型的值时才发生,并且您的示例中没有任何类型的转换。参考类型当然必须是系统。对象,系统。视频,系统。Enum或任何接口。通常很清楚;代码中有明确或隐式转换。但是,在某些情况下,情况不太清楚。例如,当调用结构基本类型的不覆盖的虚拟方法时,就会有拳击。 (在某些情况下,某些类型的通用类型约束可能会导致意外的拳击,但通常不会在实践中出现。)

其他提示

没有拳击,编译器使用LDLOCA.S指令,该指令将局部变量引用到堆栈(http://msdn.microsoft.com/en-us/library/system.reflection.emit.emit.opcodes.ldloca_s(vsvs)。 71).apx)

.method private hidebysig static void Func() cil managed
{
    .maxstack 2
    .locals init (
        [0] int32 num,
        [1] bool flag)
    L_0000: nop 
    L_0001: ldstr "5"
    L_0006: ldloca.s num
    L_0008: call bool [mscorlib]System.Int32::TryParse(string, int32&)
    L_000d: stloc.1 
    L_000e: ret 
}

不,没有拳击(需要/涉及)。

当您做一个变量时,对盒装实例的更改不会影响原始。但这正是 out 应该这样做。

编译器“某种程度上”构建了对原始变量的引用。

没有拳击;什么 out 参数确实指定必须将数字分配给 TryParse 方法。不管这一点,它仍然被视为 int, ,不是 object.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top