आपका सामान्य विधि मूल रूप से एक संदर्भ समानता की जांच प्रदर्शन किया जाएगा - और s1
के मूल्यों और s2
अलग लेकिन समान तार को देखें। आप इस तरह के और अधिक आसानी से इस दिखा सकते हैं:
string x = "test";
string y = new string(x.ToCharArray());
Console.WriteLine(x == y); // Use string overload, checks for equality, result = true
Console.WriteLine(x.Equals(y)); // Use overridden Equals method, result = true
Console.WriteLine(ReferenceEquals(x, y)); // False because they're different objects
Console.WriteLine((object) x == (object) y); // Reference comparison again - result = false
ध्यान दें कि OpTest
में अपने बाधा नहीं बदलता है जो ==
ऑपरेटर प्रयोग किया जाता है। T
पर बाधाओं के आधार पर संकलन-समय पर यह निर्धारित किया गया है। ध्यान दें कि ऑपरेटर कभी भी ओवरराइड, केवल ओवरलोडेड ओवरलोड किए गए हैं। इसका मतलब है कि निष्पादन समय पर प्रकार के बावजूद कार्यान्वयन को संकलन-समय पर चुना जाता है।
यदि आपने T
को किसी प्रकार से प्राप्त करने के लिए बाध्य किया है जो ==
ऑपरेटर को अधिभारित करता है, तो संकलक उस अधिभार का उपयोग करेगा। उदाहरण के लिए:
using System;
class SillyClass
{
public static string operator ==(SillyClass x, SillyClass y) => "equal";
public static string operator !=(SillyClass x, SillyClass y) => "not equal";
}
class SillySubclass : SillyClass
{
public static string operator ==(SillySubclass x, SillySubclass y) => "sillier";
public static string operator !=(SillySubclass x, SillySubclass y) => "very silly";
}
class Test
{
static void Main()
{
var x = new SillySubclass();
var y = new SillySubclass();
OpTest(x, y);
}
static void OpTest<T>(T x, T y) where T : SillyClass
{
Console.WriteLine(x == y);
Console.WriteLine(x != y);
}
}
यहाँ OpTest
विधि है अतिभारित ऑपरेटर का उपयोग - लेकिन केवल कभी SillyClass
, नहीं SillySubclass
से लोगों को।
स्रोत
2017-07-07 07:26:08
यह आईएल को देखने में मदद करता है उदा। इस प्रकार के व्यवहार को स्वयं शोधने के लिए ildasm का उपयोग करना। – Jeroen
यदि आप जेनेरिक कोड उपयोग में समानता के लिए तुलना करना चाहते हैं तो 'समानता कॉम्पैयर.default.Equals (एस, टी)' और वैकल्पिक रूप से उपयोगकर्ता को अपने 'IEqualityComparer ' पास करने की अनुमति देता है। –
CodesInChaos
== और बराबर() के बीच [सी # अंतर का संभावित डुप्लिकेट (https://stackoverflow.com/questions/814878/c-sharp-difference-between-and-equals) – Dukeling