yel*_*bus 3 .net c# autoboxing struct
这不是一个优化问题或任何事情.这本质上是一个什么样的问题.单例模式用于具有多次使用的对象的单个实例.这一切都很好,但是如果我尝试用结构做类似的模式,它就不会得到单个实例.
我试图用Color结构做一些事情System.Drawing.这是一些示例代码:
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();
}
Run Code Online (Sandbox Code Playgroud)
这个输出是:
redOne.Equals(redTwo) : True
redone == redTwo : True
Object.Equals(redOne, redTwo) : True
Object.ReferenceEquals(redOne, redTwo) : False
Run Code Online (Sandbox Code Playgroud)
前三个结果是可以预料的,但最后一个让我感到惊讶.现在,我最好的猜测是,当_red它从Colors.Red它返回时返回副本,正常值类型.因此,虽然只有一个实例_red,但Colors.Red返回一个全新的实例,这就是存储在redOne和redTwo中的内容.我的想法是否正确?
另外,如果这是正确的,static在结构上使用关键字是否有任何意义?
谢谢
ReferenceEquals不适用于struct/value类型,只适用于类.
在两个结构上调用ReferenceEquals会将每个结构"包装"到它自己的内存位置,然后比较两个(显然)不同的地址.
由于类已经是引用类型,因此对ReferenceEquals的调用将比较实例的实际地址.
基本上,您不需要存储"红色"的静态副本.将代码更改为以下内容:
class Colors
{
public static Color Red
{
get
{
return Color.FromArgb(0xFF, 0xFF, 0x42, 0x39);
}
}
}
Run Code Online (Sandbox Code Playgroud)
补充阅读: MSDN - 结构(C#编程指南)
因此,虽然只有一个_red实例,但Colors.Red返回一个全新的实例,这就是存储到redOne和redTwo中的实例.我的想法是否正确?
是.您有两个副本,因为Color是值类型.使用时ReferenceEquals,将结构框插入一个object,并调用Object.ReferenceEquals两个(明显不同的)盒装对象.
另外,如果这是正确的,在结构上使用static关键字是否有任何意义?
这里的要点不是让它成为一个单例 - 它是为了简化API,因此你有一个实际上是颜色的常量值:Colors.Red或Colors.Green.如果没有静态,则需要每次手动创建"红色"颜色.在这种情况下,属性实际上是一个更好看的工厂方法Colors.
| 归档时间: |
|
| 查看次数: |
1175 次 |
| 最近记录: |