我在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
对象上调用GetHashCode
和const
,这就是我无法从{{1}调用Equals
的原因}。
如何标记不会在C ++ cli中更改对象的方法?或者,什么是最合适的方式来定义平等链?
答案 0 :(得分:1)
这里有两件事:
[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
需要再次评估所有 以确保它们实际上是相等的。不看哈希代码可能会更有效率,只需逐个字段地比较对象,并在它们不相等时立即挽救。