.NETで、インターフェイスパラメーターを使用して構造体をメソッドに渡す場合、値をボックスにしますか?
質問
簡単なテストから、構造体をメソッドに渡すと値で渡されますが、最初にインターフェイスに割り当てると、参照によって渡されます。
interface IFoo { int Val { get; set; } }
struct Foo : IFoo { public int Val { get; set; } }
void Bar(IFoo foo) { foo.Val = 1; }
Foo foo = new Foo();
IFoo ifoo = new Foo();
Bar(foo);
Bar(ifoo);
Console.WriteLine(foo.Val); // 0, passed by value
Console.WriteLine(ifoo.Val); // 1, passed by ref
私の質問は、このような構造体を渡すためのボクシング操作はまだありますか?
解決
構造体がインターフェイスに変換されるたびに、箱入りになります。
Foo foo = new Foo();//Doesn't box yet
IFoo ifoo = new Foo();//Boxes
Bar(foo);//creates a new boxed copy
Bar(ifoo);//Uses the old boxed version created in line 2
インターフェイスを制約として使用してパラメータージェネリックを作成することにより、そのボクシングを回避できます。
void Bar<T>(T foo)
where T:IFoo
{
}
これは、Genericsがすべての値タイプに特化しているという事実を使用します。
しかし、あなたがあなたがあなたの構造体を不変にするために、あなたがあなたの構造体を不変にするという設計ガイドラインに従うなら、コードボックスがあろうとなかろうと、それは重要ではありません。ボクシングはわずかなパフォーマンスを引き起こすだけですが、セマンティクスをあまり変えません。
他のヒント
インターフェイスはすべて参照タイプであるため、ボクシングはラインで発生します
IFoo ifoo = new Foo();
電話するときではなく Bar
.
所属していません StackOverflow