開発者がXMLから属性を簡単に解析できるようにするXML要素のラッパーを書いています。ラッパーには、ラップされるオブジェクト以外の状態はありません。
==
オペレーターのオーバーロードを含む次の実装(この例では簡略化)を検討しています。
class XmlWrapper
{
protected readonly XElement _element;
public XmlWrapper(XElement element)
{
_element = element;
}
public string NameAttribute
{
get
{
//Get the value of the name attribute
}
set
{
//Set the value of the name attribute
}
}
public override bool Equals(object other)
{
var o = other as XmlWrapper;
if (o == null) return false;
return _element.Equals(o._element);
}
public override int GetHashCode()
{
return _element.GetHashCode();
}
static public bool operator == (XmlWrapper lhs, XmlWrapper rhs)
{
if (ReferenceEquals(lhs, null) && ReferenceEquals(rhs, null)) return true;
if (ReferenceEquals(lhs, null) || ReferenceEquals(rhs, null)) return false;
return lhs._element == rhs._element;
}
static public bool operator != (XmlWrapper lhs, XmlWrapper rhs)
{
return !(lhs == rhs);
}
}
慣用的なc#を理解しているように、==
演算子は参照の平等のためであり、Equals()
メソッドは値の平等のためです。ただし、この場合、「値」はラップされるオブジェクトへの単なる参照です。だから、私はc#の慣習的または慣用的なものが明確ではありません。
たとえば、このコードでは...
var underlyingElement = new XElement("Foo");
var a = new XmlWrapper(underlyingElement);
var b = new XmlWrapper(underlyingElement);
a.NameAttribute = "Hello";
b.NameAttribute = "World";
if (a == b)
{
Console.WriteLine("The wrappers a and b are the same.");
}
....プログラムは「ラッパーaとbは同じです」を出力する必要がありますか?それとも奇妙なことでしょう、すなわち、最小の驚きの原則に違反しますか?
Equals
までも私はオーバーライドしました==
(しかし、その逆はありません)。怠zyな慣用句ですか?最小限の驚きに違反する明示的なキャストなしで異なる動作を取得した場合。