.NET传值类型参数时如何避免装箱?
How to avoid the boxing during the value type parameter passing in .NET?
如何避免.NET中传值类型参数时的装箱?
使用ref
关键字是唯一的方法吗?例如。这样:
using System;
namespace myprogram
{
struct A {
public static void foo(ref A a) {}
}
class Program {
static void Main(string[] args) {
A a = new A();
A.foo(ref a);
}
}
}
或者还有其他方法可以做到这一点吗?
我找到了 this 答案。它解释了我应该避免哪些操作以避免装箱,但它没有告诉我该怎么做。
此外,我正在阅读 CLR via C# 这本书也忽略了如何在不装箱的情况下传递值类型的要点(或者至少在阅读这本书之后我没有找资料)。
你可以在没有关键字 "ref" 的情况下使用你的方法,因为 ref 意味着,该方法获取值类型变量的地址,而没有此关键字,该方法仅获取变量的副本。
在任何情况下,如果您将值类型发送到任何采用值类型的方法,您都不会得到装箱。为了验证这一点,它是 Msil 输出,如果您删除关键字 "ref",cs 编译器将为您当前的程序编译。
IL_0001: ldloca.s 0
IL_0003: initobj myprogram.A
IL_0009: ldloc.0
IL_000a: call void myprogram.A::foo(valuetype myprogram.A)
IL_000f: nop
IL_0010: ret
不出所料,我们没有收到任何装箱。
如何避免.NET中传值类型参数时的装箱?
使用ref
关键字是唯一的方法吗?例如。这样:
using System;
namespace myprogram
{
struct A {
public static void foo(ref A a) {}
}
class Program {
static void Main(string[] args) {
A a = new A();
A.foo(ref a);
}
}
}
或者还有其他方法可以做到这一点吗?
我找到了 this 答案。它解释了我应该避免哪些操作以避免装箱,但它没有告诉我该怎么做。
此外,我正在阅读 CLR via C# 这本书也忽略了如何在不装箱的情况下传递值类型的要点(或者至少在阅读这本书之后我没有找资料)。
你可以在没有关键字 "ref" 的情况下使用你的方法,因为 ref 意味着,该方法获取值类型变量的地址,而没有此关键字,该方法仅获取变量的副本。 在任何情况下,如果您将值类型发送到任何采用值类型的方法,您都不会得到装箱。为了验证这一点,它是 Msil 输出,如果您删除关键字 "ref",cs 编译器将为您当前的程序编译。
IL_0001: ldloca.s 0
IL_0003: initobj myprogram.A
IL_0009: ldloc.0
IL_000a: call void myprogram.A::foo(valuetype myprogram.A)
IL_000f: nop
IL_0010: ret
不出所料,我们没有收到任何装箱。