おそらく、フレームワークが構造体を提供することをすでに認識していると思いますColor
。Color
練習のためだけにクラスを作成していると思います。
static
キーワードを正しく使用しているにもかかわらず、キーワードの意味について不確実性を表明しました。がクラスまたは構造体のメンバーに適用される場合static
、そのメンバーは全体としてクラスに属し、個々のインスタンスには適用されないことを意味します。静的データ メンバー (フィールド) は一度だけ作成されます。インスタンスは独自のコピーを取得しません。静的関数 (メソッドとプロパティ) は、インスタンス参照なしで呼び出されます。
メモリ使用量に関する限り、あなたの場合はあまり心配しません。Color
クラスは、インスタンスごとに数バイトしか使用しないでください (たとえば、フレームワークの構造Color
は、赤、緑、青、およびアルファを 1 つの 32 ビット に格納しint
ます)。あなたColor
が本当に aclass
ではなく a である場合struct
、オーバーヘッドにさらに数バイトがかかります (各インスタンスには追加の 32 ビット v-table/typeinfo ポインターがあり、各参照は追加の 32 ビットです)。それでも、インスタンスあたり約 12 バイト程度です。100 種類の色があらかじめ定義されている場合は、1200 バイト以下を使用します。本当に大したことはありません。
ただし、遅延インスタンス化には理由があります。多くのメモリを使用するクラス、限られたシステム リソースを保持するクラス、自身を構築するのに時間がかかるクラスなどがあります。これらのクラスでは、次のようなパターンを使用する方がよい場合があります。
class Heavy{
static Heavy first;
static Heavy second;
public static Heavy First{
get{
if(first == null)
first = new Heavy();
return first;
}
}
public static Heavy Second{
get{
if(second == null)
second = new Heavy();
return second;
}
}
}
もう 1 つの考慮事項は、可変性です。あなたのColor
クラスは変更可能ですか、それとも不変ですか? つまり、クラスのインスタンスの値を変更できますか、それとも作成後は常に同じ値を表しますか?
あなたColor
が変更可能な場合、静的な「赤」アクセサーを持つ唯一の正しい方法は、アクセスするたびに新しいものを作成する2番目の例です。そうすれば、誰かが次のようなことをすることはできません:
Color.Red.G = 255;
代わりに、単一の共有 Color.Red インスタンスが実際に黄色を表すようにします。
ただし、次のような場合にも注意してください。
for(int y = 0; y < bmp.Height; y++)
for(int x = 0; x < bmp.Width; x++)
if(bmp.GetPixel(x, y) == Color.Red))
MessageBox.Show("Found a red pixel!");
クラスの多くのインスタンスが作成されます。Color
もちろん、それらは後でガベージコレクションされますが、これはまだ上記の最初の構成 (または私が示した「重い」例) の場合の引数です。
あなたColor
が実際に構造体である場合、それは少し異なる話です。構造体の場合new
、ヒープの割り当てはなく、v テーブルや参照ポインターもないため、実際の考慮事項は、コンストラクターにかかる時間だけです。