यह कोड पूरी तरह से समझता है अगर वह कोड Object.Equals
ओवरराइड के अंदर है और आप समानता ऑपरेटर (जो उदाहरण के लिए, गलती से Equals
पर कॉल करना चाहते हैं) का आह्वान नहीं करना चाहते हैं। ऑब्जेक्ट को कास्टिंग मानक समानता ऑपरेटर को कॉल करने की अनुमति देता है, जो संदर्भों की तुलना करता है।
आम तौर पर, आप Object.ReferenceEquals
का उपयोग Equals
ओवरराइड अंदर null
को एक वस्तु का एक उदाहरण तुलना करने के लिए होगा।
उदाहरण के लिए, इस ढेर अतिप्रवाह कारण होगा:
public class Point {
public override bool Equals (object other) {
var otherPoint = other as Point;
if (other == null)
return false;
//...
}
public static bool operator == (Point l, Point r) {
//...
//null checks
if (!l.Equals(r))
return false;
}
}
ऊपर के उदाहरण समानता ऑपरेटर में Equals
कॉल करता है और क्योंकि otherPoint
वैरिएबल प्रकार Point
की है, यह समानता ऑपरेटर आह्वान होता है, अनंत प्रत्यावर्तन के कारण।
आम तौर पर, जब आप Equals
ओवरराइड करते हैं और समानता ऑपरेटर को परिभाषित करते हैं, तो आप तुलनात्मक तर्क को ऑपरेटर में डाल देंगे और Equals
ओवरराइड से इसका आह्वान करेंगे। ध्यान रखें कि कक्षा के लिए ओवरराइड होने पर वर्ग को अपरिवर्तनीय होने की अनुशंसा की जाती है।
public class Point {
public override bool Equals (object other) {
var otherPoint = other as Point;
return this == otherPoint;
}
//must override GetHashCode() as well
public static bool operator == (Point l, Point r) {
if (Object.ReferenceEquals(l, null) && Object.ReferenceEquals(r, null))
return true;
if (Object.ReferenceEquals(l, null) || Object.ReferenceEquals(r, null))
return false;
//actual equality checks
}
public static bool operator != (Point l, Point r) {
return !(l==r);
}
}
स्रोत
2010-05-25 21:54:21
आपको इसकी आवश्यकता नहीं है। – ChrisF
मैं उसके लिए यह कहने का इंतजार कर रहा हूं कि उसके शिक्षक ने ऐसा करने के लिए कहा या कुछ :) – Earlz
ठीक है लेकिन ... http://msdn.microsoft.com/en-us/library/ms173147(VS.80) .aspx –