加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在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);
        }
    }
}

补充阅读:
MSDN – Structs (C# Programming Guide)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读