在C#中使用结构的单身人士

在C#中使用结构的单身人士,第1张

概述这不是一个优化问题或任何事情.这本质上是一个什么样的问题.单例模式用于具有多次使用的对象的单个实例.这一切都很好,但是如果我尝试用结构做类似的模式,它就不会得到单个实例. 我试图在System.Drawing中使用Color结构做一些事情.这是一些示例代码: class Colors { private static Color _red; public s 这不是一个优化问题或任何事情.这本质上是一个什么样的问题.单例模式用于具有多次使用的对象的单个实例.这一切都很好,但是如果我尝试用结构做类似的模式,它就不会得到单个实例.

我试图在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#中使用结构的单身人士所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1222384.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存