C ++ cli中const对象的Equality运算符Equals,GetHashCode

时间:2015-11-21 09:46:06

标签: c++-cli equality

我在C ++ cli中创建了一个新的托管引用类。现在我想重载此类对象的相等性。

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
}

在上面的代码段中,无法在Equals对象上调用GetHashCodeconst,这就是我无法从{{1}调用Equals的原因}。

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

1 个答案:

答案 0 :(得分:1)

这里有两件事:

  • .Net并没有像C ++那样拥有 [hyphenate_word(x) for x in ["backwoodsman", "whatsoever", "hereupon", "counterclockwise", "notwithstanding", "highwayman "]] [['back', 'woods', 'man'], ['what', 'so', 'ev', 'er'], ['here', 'upon'], ['coun', 'ter', 'clock', 'wise'], ['notwith', 'stand', 'ing'], ['high', 'way', 'man ']] 的概念。 C ++ / CLI将强制执行C ++的规则,但由于.Net不使用它,因此没有声明库方法const,因此您在调用任何方法时都会遇到问题。而不是像在C ++中那样显式声明,而是像const这样的方法不会修改它们的参数。
  • 由于您使用了equals,我认为您试图并行传递const%参数的C ++约定。 const&在使用%双指针时比**更相似:当方法将参数传递为&(或参考类型为%时)可以为参数赋值,并且它应该可用于调用方法。

以下是我将如何实现这一点:

^%

你说的另一件事:

  

... 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

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

GetHashCode需要评估所有内容,然后如果哈希码相等,那么GetHashCode需要再次评估所有 以确保它们实际上是相等的。不看哈希代码可能会更有效率,只需逐个字段地比较对象,并在它们不相等时立即挽救。