ReferenceEquals()的合法使用

时间:2012-03-28 15:38:46

标签: c# .net pointers collections reference

在编写为遵循声明式样式的.NET程序中,ReferenceEquals()的一些合法用途是什么?

3 个答案:

答案 0 :(得分:12)

不确定“写入以遵循声明式样式”是什么意思,但通常在覆盖ReferenceEquals运算符时使用==。来自http://msdn.microsoft.com/en-us/library/ms173147.aspx

public static bool operator ==(ThreeDPoint a, ThreeDPoint b)
{
    // If both are null, or both are same instance, return true.
    if (System.Object.ReferenceEquals(a, b))
    {
        return true;
    }

    // If one is null, but not both, return false.
    if (((object)a == null) || ((object)b == null))
    {
        return false;
    }

    // Return true if the fields match:
    return a.x == b.x && a.y == b.y && a.z == b.z;
}

请务必在下方查看注意

  

注意:运算符==的重载中的常见错误是使用(a == b),(a == null)或(b == null)来检查引用相等性。这个   而是创建一个对重载运算符==的调用,导致   无限循环。使用ReferenceEquals或将类型转换为Object,to   避免循环。

答案 1 :(得分:11)

  

在编写为遵循声明式样式的.NET程序中,ReferenceEquals()的一些合法用途是什么?

无论编写程序的“样式”如何,只有一个合法使用的ReferenceEquals:比较两个引用以进行引用相等

如果您使用ReferenceEquals而不是比较两个引用以获得引用相等性,那么您可能做错了。

答案 2 :(得分:1)

好吧,如果相关对象的设计和/或使用是这样的,任何对象的实例永远不会超过任何其他对象,那么它将是正确的,并且它可能更快而不是比较一些实例变量。

或者,正如在另一个答案中发布的那样,您可以先将其检查为“简单”,并且只有在它们不同时才执行深度等于检查。这种用法只是提高了性能。