.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

不出所料,我们没有收到任何装箱。