![](/img/trans.png)
[英]Can ReferenceEquals with strings be reliably used to detect a sentinel value?
[英]Why is ReferenceEquals still used with value types?
有一个很好的解释为什么object.ReferenceEquals(this, obj)
不能用于值类型:
使用 ReferenceEquals 比较值时,如果 objA 和 objB 是值类型,则在将它们传递给 ReferenceEquals 方法之前将它们装箱。 这意味着即使 objA 和 objB 都表示值类型的同一实例,ReferenceEquals 方法仍然返回 false
但是,我发现类似于以下代码段的代码:
internal readonly struct Foo
{
public override bool Equals(object obj)
{
if (object.ReferenceEquals(this, obj))
{
return true;
}
if (obj is Foo other)
{
return this.Equals(other);
}
return false;
}
public bool Equals(Foo other)
{
// ..
return true;
}
}
这是错误的还是存在ReferenceEquals
可能对值类型(尤其是结构)有用(即评估为真)的边缘情况?
不应该。 编写的代码很糟糕,因为它不必要地为永远无法工作的测试打包了一些东西。 为了完整起见,在这种情况下,更有用和惯用的模式是:
// custom Foo equality implementation
public bool Equals(Foo other)
{
// ...
}
// default object implemenentation
public override int GetHashCode() {...} // must match Equals(Foo) logic
public override bool Equals(object obj) => obj is Foo other && Equals(other);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.