.NET 4.0では、重い/大きなオブジェクトインスタンスを遅延初期化するためのラッパークラスであるLazyクラスが導入されました。これは、最初にアクセスされたとき(および最初のときのみ)ラップされたオブジェクトインスタンスを初期化する.Valueプロパティを提供します。 .Valueが決してアクセスされない場合、ラップされるオブジェクトインスタンスは決して初期化されません。しかし、あなた自身がすでにあなた自身でこのようなことをしているように思えます。
オブジェクトが重い場合、プロパティのない軽量クラスまたはNULL変数を持つ元のクラス:質問のプロパティが参照型である場合、唯一の浪費は参照型へのポインタですx86ではプロパティごとに4バイト、x64ではプロパティごとに8バイトのいずれかです。 .NETでの空のクラスインスタンスのデフォルトの最小サイズは約24バイトです。例えば
:
public class MyClassLight
{
public int PropertyInt { get; set; } // 4 byte value type
public OtherClass1 PropertyOtherClass1 { get; set; } // 4 or 8 byte reference type
}
public class MyClassHeavy
{
public int PropertyInt { get; set; } // 4 byte value type
public string PropertyString { get; set; } // 4 or 8 byte reference type
public OtherClass1 PropertyOtherClass1 { get; set; } // 4 or 8 byte reference type
public OtherClass2 PropertyOtherClass2 { get; set; } // 4 or 8 byte reference type
}
のはMyClassLightのインスタンスはオーバーヘッド+ 4バイト+ 4バイト24バイト=メモリの32のバイトを要するだろう、あなたは、x86上で実行されていたとしましょう。
MyClassHeavyは、24バイトのオーバーヘッド+ 4バイト+ 4バイト+ 4バイト+ 4バイト=メモリの40バイトであろう。
重いクラスに参照型の50個のプロパティがあっても、それらをNULLにすると、インスタンスごとに余分な200バイトのメモリが必要になります(クラスではポインタのメモリを予約する必要があるためいくつかのポイント)。これらのオブジェクトがメモリに何十万または何百万もある場合、オブジェクトあたり200バイトが問題になるかもしれませんが、そうでない場合は無視できます。
50クラスの2つのバージョンを持っていることの追加複雑さは、それだけの価値は思えません。しかし、あなたがそのルートに行く必要があるなら、私はそれをリファクタリングして両方のクラス(軽量と重)が共有するプロパティだけを含むインターフェイスを作成し、できるだけコンクリートクラスの代わりにインターフェイスを使用するようにコードをリファクタリングします軽いクラスと重いクラスの両方で。
おそらく、構成オブジェクトを使用することができます。つまり、重いプロパティを持つ別のクラスを使用していて、オリジナルのものを使用している可能性があります。それはかなり大きな変更になるでしょう。 –
あなたはどんな費用を心配していますか?荷物を積み込むことは高価ですが、何も手をつけないでコストを「運びます」。 –
@HenkHolterman私は、私が使用するオブジェクトのコレクションについて(他のものの中でも)30のプロパティのうち5つを言いますと心配しています。コレクションに50個のオブジェクトが含まれている場合、50 * 25個の不要なプロパティが作成されます。これにほとんど費用がかからなければ、それは本当に問題ではありません。 –