मैं 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);
}
}
जैसा कि मैं मुहावरेदार ग # को समझता हूं, ==
ऑपरेटर संदर्भ समानता के लिए है जबकि 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
मैंने कभी भी ओवररोड नहीं किया==
(लेकिन कभी भी दूसरा रास्ता नहीं देखा)। आलसी मुहावरेदार है? अगर मुझे स्पष्ट कास्ट के बिना अलग व्यवहार मिलता है जो कम से कम विस्मय का उल्लंघन करता है।