Saya sedang menulis pembungkus untuk elemen XML yang memungkinkan pengembang untuk dengan mudah mengurai atribut dari XML. Pembungkus tidak memiliki status selain objek yang dibungkus.
Saya sedang mempertimbangkan implementasi berikut (disederhanakan untuk contoh ini) yang mencakup kelebihan bagi ==
operator.
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);
}
}
Seperti yang saya mengerti c # idiomatik, ==
operator adalah untuk referensi kesetaraan sedangkan Equals()
metode untuk kesetaraan nilai. Tetapi dalam kasus ini, "nilai" hanyalah referensi ke objek yang dibungkus. Jadi saya tidak jelas apa yang konvensional atau idiomatik untuk c #.
Misalnya, dalam kode ini ...
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.");
}
.... haruskah keluaran program "Pembungkus a dan b sama"? Atau apakah itu aneh, yaitu melanggar prinsip paling tidak heran ?
Equals
saya tidak pernah mengalahkan==
(tapi tidak pernah sebaliknya). Apakah malas idiomatis? Jika saya mendapatkan perilaku yang berbeda tanpa pemeran eksplisit yang melanggar paling tidak heran.