개발자가 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
결코 무시하지 않았다==
(그러나 결코 다른 방법은 아니다). 게으른 관용적입니까? 가장 놀랍게도 위반하는 명백한 캐스트없이 다른 행동을한다면.