Estoy escribiendo un contenedor para elementos XML que permite a un desarrollador analizar fácilmente los atributos del XML. El contenedor no tiene otro estado que el objeto que se está envolviendo.
Estoy considerando la siguiente implementación (simplificada para este ejemplo) que incluye una sobrecarga para el ==
operador.
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);
}
}
Según entiendo idiomatic c #, el ==
operador es para la igualdad de referencia, mientras que el Equals()
método es para la igualdad de valores. Pero en este caso, el "valor" es solo una referencia al objeto que se está envolviendo. Por lo tanto, no tengo claro qué es convencional o idiomático para c #.
Por ejemplo, en este código ...
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.");
}
.... ¿debería el programa generar "Los contenedores a y b son iguales"? ¿O sería extraño, es decir, violar el principio de menor asombro ?
Equals
, nunca superé==
(pero nunca al revés). ¿Es perezoso idiomático? Si obtengo un comportamiento diferente sin un reparto explícito que viola menos asombro.