C# 引用equals()的合法使用

C# 引用equals()的合法使用,c#,.net,pointers,collections,reference,C#,.net,Pointers,Collections,Reference,在按照声明式风格编写的.NET程序中,ReferenceEquals()有哪些合法用途?不确定“按照声明式风格编写”是什么意思,但在重写=运算符时通常使用ReferenceEquals。发件人: 重要的是要查看下面的注释,了解理由: 注意:运算符==重载中的一个常见错误是使用(A==b)、(A==null)或(b==null)检查引用相等性。这 而是创建对重载运算符==的调用,导致 无限循环。使用ReferenceEquals或将类型强制转换为Object,以 避免循环 好吧,如果相关对象的设计

在按照声明式风格编写的.NET程序中,ReferenceEquals()有哪些合法用途?

不确定“按照声明式风格编写”是什么意思,但在重写
=
运算符时通常使用
ReferenceEquals
。发件人:

重要的是要查看下面的注释,了解理由:

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


好吧,如果相关对象的设计和/或使用使得任何对象的实例都不会超过一个与其他对象“相等”,那么它将是正确的,并且可能比比较一些实例变量更快

或者,如另一个答案所示,您可以首先将其检查为“轻松退出”,并且仅在它们不同时执行深度相等检查。这种用法只是一种性能改进

在按照声明式风格编写的.NET程序中,ReferenceEquals()有哪些合法用途

无论编写程序的“风格”如何,ReferenceEquals只有一种合法用法:比较两个引用以获得引用相等


如果您使用ReferenceEquals来实现引用相等,而不是比较两个引用来实现引用相等,那么您可能是做错了什么事。

当您想回答“这两个引用是否引用同一个对象”的问题时,使用ReferenceEquals是合理的。您使用声明式的确切含义是什么,这与引用相等有什么关系?@GregC我知道,而且你显然也知道,但是每一个阅读代码的程序员都知道,不必去查找它吗?对于不希望重写
等于的类,非虚拟的
ReferenceEquals
方法比使用
Equals
及其关联的虚拟分派更快。速度优势足以证明使用它代替
Object.Equals(Object,Object)
。一个更有趣的问题是,当
Equals(X,Y)
为真,而
ReferenceEquals(X,Y)
为假时,是否应该将做任何特殊的事情视为违反封装。嗯,从一个非常真实的意义上讲,它应该是这样的。@GregC:在C#call
对象中使用
==
操作符。Equals
而不是执行相当于
ReferenceEquals
的引用比较,会使很多代码运行得慢很多。概念上,给定
字符串s1=“0”;字符串s2=0.ToString();字符串s3=s1;“
应该无法判断
s3
是从
s2
还是
s1
复制的,但是确保包含相同字符的所有字符串确实不可区分将是昂贵的,并且不会带来太多好处。@GregC这里需要检查,否则
null==null
场景将中断。还要注意,
null
检查本身使用引用相等。它们只使用cast to object而不是
ReferenceEquals
ReferenceEquals(a,b)
相当于
(object)a==(object)b
)@GregC不能保证它是相同的,但从上下文来看,它应该是相同的。如果它的行为不同,很可能是因为深层相等部分存在错误。如果没有对ReferenceEquals进行检查,并且a和b都为null,则返回false。实际上,它返回true。它可能是AKE感测到NoR检查是否有XOR。这将在技术上与它所做的一致,并消除对先前检查的无文件依赖性。它对实际性能没有影响,只是可读性和可维护性。对我的品味有点同义。“Tautological,当然。但是考虑一下那些人的数量。使用GetHashCode进行除平衡哈希表之外的其他操作。或者当需要字符串相等时使用字符串排序的人数。或者当表示Any()时使用Count()的人数@GregC:如果你想得到一个更具体的答案,那就问一个更具体的问题。@GregC:你不会从我这里得到任何论据。有多少种不同的方法可以比较两个事物的相等性,这完全是混淆不清的,而且当你把顺序加入到混合中时,情况会变得更糟。@dnkulkarni:编译器会生成一个引用比较。
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;
}