Sto scrivendo un wrapper per elementi XML che consente a uno sviluppatore di analizzare facilmente gli attributi dall'XML. Il wrapper non ha altro stato se non l'oggetto da avvolgere.
Sto prendendo in considerazione la seguente implementazione (semplificata per questo esempio) che include un sovraccarico per l' ==
operatore.
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);
}
}
Come ho capito idiomatico c #, l' ==
operatore è per l'uguaglianza di riferimento mentre il Equals()
metodo è per l'uguaglianza di valore. Ma in questo caso, il "valore" è solo un riferimento all'oggetto che viene spostato. Quindi non sono chiaro cosa sia convenzionale o idiomatico per c #.
Ad esempio, in questo codice ...
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.");
}
.... dovrebbe apparire il programma "I wrapper aeb sono uguali"? O sarebbe strano, vale a dire violare il principio del minimo stupore ?
Equals
non ho mai scavalcato==
(ma mai il contrario). Pigro è idiomatico? Se ottengo un comportamento diverso senza un cast esplicito che viola il minimo stupore.