次のシナリオを検討してください。
int Caller1<T>(T t) where T : IInterface {...}
T Caller2<T>() where T : IInterface {...}
class Wrappee // doesn't implement IInterface, but could
??? Wrapper : IInterface {
private readonly Wrappee _wrappee;
// methods call _wrappee's methods
}
struct
ここで、とのどちらかを選択するための一般的なアドバイスは、 「値セマンティクスと参照セマンティクスが必要な場合にclass
使用する」です。必要なセマンティクスは「への参照」です。しかし、まだ構造体を作成できるようです: その値をコピーすることは参照をコピーすることと同じであり、コピーは同じオブジェクトへの参照を持ちます! オーバーヘッドが低くなり、スカラー置換によってローカル変数のオーバーヘッドをゼロに減らすことができる場合があります。で変更メソッドを呼び出しても問題ないようです。struct
class
Wrappee
Wrapper
Wrappee
_wrappee
何か不足していますか?Wrapper
代わりにクラスを作成する正当な理由はありますか?
呼び出し元が一般的でない場合は、次の 1 つがあります。
int Caller(IInterface t) {...}
この場合Wrapper
、ボクシングを避けるためのクラスにする必要があります。
Haskell を知っている人へのコメント: に最も近い .NET アナログを見つけようとしていますnewtype
。
更新:最初のケースでのボックス化の欠如については、MSDN フォーラムでProfessional .NET 2.0 GenericsとPeter Ritchie を参照してください。