次のシナリオを検討してください:.NETのラッパータイプ:構造体またはクラス?
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
の間で選択するための一般的なアドバイスは、「あなたが参照セマンティクスのために値のセマンティクスとclass
が必要な場合struct
を使用する」です。必要なセマンティクスは「Wrappee
への参照」です。しかし、我々はまだWrapper
構造体を作ることができるようです:その値をコピーするのは同じですWrappee
のコピーと同じであり、コピーは同じオブジェクトへの参照を持つでしょう!オーバーヘッドは低く、scalar replacementはローカル変数の値を0に減らすことができます。 _wrappee
で突然変異法を呼び出すことは大丈夫です。
何か不足していますか?代わりにWrapper
をクラスにする良い理由はありますか?
呼び出し側がジェネリックでない場合は、1つがあります:
int Caller(IInterface t) {...}
この場合Wrapper
はボクシングを避けるために、クラスでなければなりません。
ハスケルを知っている人のための備考:最も近い.NETアナログをnewtype
に見つけることを試みています。
更新:最初のケースでボクシングがない場合は、Professional .NET 2.0 GenericsとPeter Ritchie on MSDN forumsを参照してください。
一般的なタイプのパラメータとして構造体を使用すると、ボクシングの必要性に違いが生じるのはなぜですか? –
アップデートを参照してください。 –