c# - 这两个功能是等价的吗?
问题描述
我正在尝试添加一个 equals 函数来比较两个结构,但我不确定编写它的正确方法,或者这两个函数是否有效。
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
Tile other = (Tile) obj;
return other == this;
}
和
public override bool Equals(object obj)
{
if (obj is Tile other)
{
return other == this;
}
return false;
}
我的 == 运算符是:
public static bool operator ==(Tile a, Tile b)
{
return a.X == b.X && b.Z == a.Z;
}
这些功能是相同的还是以我可能不知道的微妙方式不同?
解决方案
如果没有一个最小的、完整的和可验证的代码示例,就不可能完全相信您发布的代码示例是否等效。但是,假设除了您发布的之外没有其他运算符重载,它们似乎是等效的。
他们最终都将使用operator ==
提供的重载来比较有问题的两个对象。因此,唯一可能的区别在于所做的类型检查。并且两者都将有效地返回false
值obj
isnull
或错误类型。
在我看来,这可以很容易地通过一个简单的程序进行测试。正如您问题的评论中所指出的,理想情况下,Equals()
无论如何都要避免为值类型调用该方法(即避免装箱/拆箱开销),从而使具体的实现没有实际意义。因此,目前还不清楚提出这个问题的目的是什么。如果您在某些情况下使用这些实现中的一个或另一个会出现一些意外行为,您应该发布一个新问题,但提供一个很好的MCVE来重现您正在处理的问题,并详细说明具体是什么你需要帮助。
推荐阅读
- mysql - 使用 peewee 和 pymysql 设置 'charset=utf8' 时出现问题
- android - 代码没有显示错误,但应用程序崩溃了
- amazon-web-services - Terraform destroy 无法清理现场队列 ec2 实例
- mysql - 关于连接多个表的 SQL 语法
- xcode - 为什么我在尝试构建项目时不断收到此错误?
- c# - 双向集合绑定
- firebase - firebase 检索过早返回
- python - “XDG_CACHE_HOME=/cache”中的内容与“-d /build”中的内容有何不同?
- java - 字符串类中的“散列”变量
- c++ - 使用 constexpr 作为 std::array 大小