我有这样的结构
struct MyStructure
:IFoo
{
}
和这样的方法:
public BarThisFoo(IFoo a)
{
}
我的问题是将结构传递给该方法是否会“装箱”结构,从而导致垃圾分配?
附录: 在有人说之前,垃圾收集在这个应用程序中不是免费的,它实际上对垃圾收集非常敏感,因此分配免费代码很重要。
最佳答案
为了避免装箱,您可以使用带有约束的泛型:
struct MyStructure
:IFoo
{
}
public void BarThisFoo<T>(T a) where T : IFoo
{
}
参见 J. Richter CLR via C# ,第 2 版,第 14 章:接口(interface),关于泛型和接口(interface)约束的部分。
编辑:
示例代码
using System;
using System.Collections;
interface IFoo {
void Foo();
}
struct MyStructure : IFoo {
public void Foo() {
}
}
public static class Program {
static void BarThisFoo<T>(T t) where T : IFoo {
t.Foo();
}
static void Main(string[] args) {
MyStructure s = new MyStructure();
BarThisFoo(s);
}
}
方法 Main 的 IL 代码不包含任何框指令:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 15 (0xf)
.maxstack 1
.locals init ([0] valuetype MyStructure s)
IL_0000: ldloca.s s
IL_0002: initobj MyStructure
IL_0008: ldloc.0
IL_0009: call void Program::BarThisFoo<valuetype MyStructure>(!!0)
IL_000e: ret
} // end of method Program::Main
关于c# - 将结构传递到接口(interface)字段是否分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1816419/