我试图在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) : Trueredone == redTwo : TrueObject.Equals(redOne,redTwo) : TrueObject.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); } }}
补充阅读:
MSDN – Structs (C# Programming Guide)
以上是内存溢出为你收集整理的在C#中使用结构的单身人士全部内容,希望文章能够帮你解决在C#中使用结构的单身人士所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)