在C#中使用结构的单身人士
发布时间:2020-12-16 00:06:28 所属栏目:百科 来源:网络整理
导读:这不是一个优化问题或任何事情.这本质上是一个什么样的问题.单例模式用于具有多次使用的对象的单个实例.这一切都很好,但是如果我尝试用结构做类似的模式,它就不会得到单个实例. 我试图在System.Drawing中使用Color结构做一些事情.这是一些示例代码: class C
这不是一个优化问题或任何事情.这本质上是一个什么样的问题.单例模式用于具有多次使用的对象的单个实例.这一切都很好,但是如果我尝试用结构做类似的模式,它就不会得到单个实例.
我试图在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,Object.ReferenceEquals(redOne,redTwo)); Console.ReadLine(); } 这个输出是: redOne.Equals(redTwo) : True redone == redTwo : True Object.Equals(redOne,redTwo) : True Object.ReferenceEquals(redOne,redTwo) : False 前三个结果是可以预料的,但最后一个让我感到惊讶.现在,我最好的猜测是,当从Color.Red返回_red时,它返回一个副本,正常值类型.因此,虽然只有一个_red实例,但Colors.Red返回一个全新的实例,这就是存储到redOne和redTwo中的实例.我的想法是否正确? 另外,如果这是正确的,在结构上使用static关键字是否有任何意义? 谢谢 解决方法
ReferenceEquals不适用于struct / value类型,只适用于类.
在两个结构上调用ReferenceEquals会将每个结构“包装”到它自己的内存位置,然后比较两个(显然)不同的地址. 由于类已经是引用类型,因此对ReferenceEquals的调用将比较实例的实际地址. 基本上,您不需要存储“红色”的静态副本.将代码更改为以下内容: class Colors { public static Color Red { get { return Color.FromArgb(0xFF,0x39); } } } 补充阅读: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |