Estou escrevendo um wrapper para elementos XML que permite que um desenvolvedor analise facilmente atributos do XML. O wrapper não possui outro estado além do objeto que está sendo quebrado.
Estou considerando a seguinte implementação (simplificada para este exemplo), que inclui uma sobrecarga para o ==
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);
}
}
Pelo que entendi c # idiomático, o ==
operador é para igualdade de referência, enquanto o Equals()
método é para igualdade de valor. Mas, neste caso, o "valor" é apenas uma referência ao objeto que está sendo quebrado. Portanto, não estou claro o que é convencional ou idiomático para c #.
Por exemplo, neste 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.");
}
.... o programa deve exibir "Os wrappers aeb são iguais"? Ou isso seria estranho, ou seja, violaria o princípio de menor espanto ?
Equals
eu nunca substituí==
(mas nunca o contrário). O idiota preguiçoso? Se eu tiver um comportamento diferente sem um elenco explícito que viole menos espanto.