これは実際には最適化の質問でも何でもありません。それは本質的に、一体何が起こっているのかという種類の質問です。シングルトン パターンは、オブジェクトの単一インスタンスを複数回使用するために使用されます。これで十分ですが、構造体で同様のパターンを実行しようとすると、単一のインスタンスが得られません。
Color
の構造体で何かをしようとして、これについて来ましたSystem.Drawing
。コード例を次に示します。
class Colors
{
private static Color _red;
public static Color Red
{
get
{
if (_red.IsEmpty)
_red = Color.FromArgb(0xFF, 0xFF, 0x42, 0x39);
return _red;
}
}
}
static void Main(string[] args)
{
var redOne = Colors.Red;
var redTwo = Colors.Red;
Console.WriteLine("redOne.Equals(redTwo) : {0}", redOne.Equals(redTwo));
Console.WriteLine("redOne == redTwo : {0}", redOne == redTwo);
Console.WriteLine("Object.Equals(redOne, redTwo) : {0}", Object.Equals(redOne, redTwo));
Console.WriteLine("Object.ReferenceEquals(redOne, redTwo) : {0}", Object.ReferenceEquals(redOne, redTwo));
Console.ReadLine();
}
この出力は次のとおりです。
redOne.Equals(redTwo) : True
redone == redTwo : True
Object.Equals(redOne, redTwo) : True
Object.ReferenceEquals(redOne, redTwo) : False
最初の 3 つの結果は当然のことですが、最後の結果には驚かされました。さて、私の最善の推測は、通常の値型がそうであるように、_red
が返されたときColors.Red
にコピーを返しているということです。したがって、 のインスタンスは 1 つしかありませんが、新しいインスタンス_red
をColors.Red
返し、それが redOne と redTwo に格納されます。私の考えは正しいですか?
また、それが正しければ、構造体でstatic
キーワードを使用する意味はありますか?
ありがとう