Ich schreibe einen Wrapper für XML-Elemente, mit dem ein Entwickler Attribute einfach aus dem XML-Code analysieren kann. Der Wrapper hat keinen anderen Status als das Objekt, das umbrochen wird.
Ich denke an die folgende Implementierung (vereinfacht für dieses Beispiel), die eine Überlastung für den ==
Bediener beinhaltet.
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);
}
}
Nach meinem Verständnis für C # dient der ==
Operator der Referenzgleichheit, während die Equals()
Methode der Wertgleichheit dient. In diesem Fall ist der "Wert" jedoch nur ein Verweis auf das Objekt, das umgebrochen wird. Mir ist also nicht klar, was für c # konventionell oder idiomatisch ist.
Zum Beispiel in diesem Code ...
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.");
}
.... sollte das Programm "Die Wrapper a und b sind gleich" ausgeben? Oder wäre das seltsam, das Prinzip des geringsten Erstaunens zu verletzen ?
Equals
ich nie==
(aber niemals umgekehrt). Ist faul idiomatisch? Wenn ich ein anderes Verhalten ohne eine explizite Besetzung bekomme, die am wenigsten gegen das Erstaunen verstößt.