我正在为XML元素编写包装器,使开发人员可以轻松地解析XML中的属性。包装器除了被包装的对象外没有其他状态。
我正在考虑以下实现(此示例已简化),其中包括==
操作员的重载。
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);
}
}
据我了解惯用的C#,==
运算符用于引用相等,而Equals()
方法用于值相等。但是在这种情况下,“值”只是对要包装的对象的引用。所以我不清楚c#是常规的还是惯用的。
例如,在此代码中...
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.");
}
....程序是否应该输出“包装器a和b相同”?还是奇怪,即违反了最小惊讶原则?
Equals
我一直推崇的所有时间里,我从未推崇==
(但从未相反)。懒惰成语吗?如果我在没有显式强制转换的情况下得到不同的行为,则违反了最少的惊讶。