C++ cli 中 const 对象的相等运算符、Equals、GetHashCode

Equality operator, Equals, GetHashCode for const objects in C++ cli

我在 C++ cli 中创建了一个新的托管引用 class。现在我想重载这个 class.

对象的相等性
public ref class DerivedFromObject {
    virtual bool Equals(Object^ obj) override;
    virtual int GetHashCode() override;
    static bool operator!= (const DerivedFromObject%, const DerivedFromObject%);
    static bool operator== (const DerivedFromObject%, const DerivedFromObject%);
}

据我所知,从 C# 中,operator!= 调用 operator==,调用 Equals,它指的是 GetHashCode

bool DerivedFromObject::operator==(const DerivedFromObject % a, const DerivedFromObject % b)
{
   a.Equals((Object^)%b); // Error
}

在上面的代码片段中,无法在 const 对象上调用 EqualsGetHashCode,这就是我无法从 operator== 调用 Equals 的原因。

如何在 C++ cli 中标记不更改对象的方法?或者最恰当的定义平等链的方式是什么?

这里有两件事:

  • .Net 并不像 C++ 那样真正具有 const 的概念。 C++/CLI 将强制执行 C++ 的规则,但由于 .Net 不使用它,因此没有声明任何库方法 const,因此您在调用任何方法时都会遇到问题。不像在 C++ 中那样被显式声明,只是按照惯例,像 equals 这样的方法不会修改它们的参数。
  • 由于您使用了 const%,我认为您是在尝试平行于传递 const& 参数的 C++ 约定。 % 在用法上更类似于 ** 双指针而不是 &:当方法可以为参数赋值,并且它应该对调用方法可用。

以下是我的实现方式:

public ref class DerivedFromObject : IEquatable<DerivedFromObject> {
    virtual bool Equals(DerivedFromObject^ other);
    virtual bool Equals(Object^ obj) override;
    virtual int GetHashCode() override;
    static bool operator!= (DerivedFromObject^, DerivedFromObject^);
    static bool operator== (DerivedFromObject^, DerivedFromObject^);
}

你说的另一件事:

...Equals, which refers to GetHashCode.

这里要小心,因为不相等的对象可能具有相同的哈希码。

GetHashCode 将需要评估所有内容,然后如果哈希码相等,则 Equals 需要再次评估所有内容 以确保它们'实际上是平等的。不看哈希码可能会更有效,只是逐个字段比较对象,一旦不相等就退出。