这不是一个优化问题或其他任何问题。它本质上是一个“到底发生了什么”的问题。单例模式用于多次使用同一对象的单个实例。这很好,但如果我尝试使用结构体进行类似的模式,则不会得到单个实例。
我通过尝试对System.Drawing
中的Color
结构进行某些操作而遇到了这个问题。以下是一些示例代码:
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
前三个结果符合预期,但最后一个让我感到惊讶。现在,我最好的猜测是,当从
Colors.Red
返回_red
时,它返回一个副本,就像普通值类型一样。 因此,虽然只有一个_red
实例,但Colors.Red
返回一个全新的实例,并将其存储到redOne和redTwo中。我的想法正确吗?另外,如果这是正确的,请问在结构体上使用
static
关键字是否有任何意义?谢谢
static
基本上意味着颜色红色对于Color类的所有实例都是相同的颜色。 - Robert Harvey