मैं सी # में structs और इंटरफेस के बीच अजीब अंतर के साथ आया (मेरे अनुसार)। इस इंटरफेस और struct पर विचार करें:सी # गेटर्स/सेटर्स और इंटरफेस में सेटर्स
public interface INumber
{
void ChangeNumber(int n);
void Log();
}
public struct Number : INumber
{
private int n;
public void ChangeNumber(int n)
{
this.n = n;
}
public void Log()
{
Console.WriteLine(this.n);
}
}
जब मैं एक संपत्ति के रूप में संख्या के साथ एक नया वर्ग बनाने के लिए, ChangeNumber विधि का उपयोग करने के लिए 2 n बदल सकते हैं और प्रवेश का उपयोग करके संख्या मुद्रित करने के लिए, यह 0 के बजाय प्रिंट:
public class NumberContainer
{
public Number Number { get; set; }
public NumberContainer()
{
this.Number = new Number();
this.Number.ChangeNumber(2);
this.Number.Log(); //prints 0...
}
}
थोड़ी देर बाद मुझे एहसास हुआ कि जब मैं this.Number.ChangeNumber(2);
पर कॉल करता हूं, तो मैं वास्तव में एक नई वस्तु (गेटटर की वजह से) बनाता हूं और उस नंबर को 2 में बदलता हूं। लेकिन फिर मैंने संख्या को बदलकर कोड का थोड़ा सा बदल दिया एक एम्बर संपत्ति के लिए संपत्ति:
public class NumberContainer
{
public INumber Number { get; set; }
public NumberContainer()
{
this.Number = new Number();
this.Number.ChangeNumber(2);
this.Number.Log(); //prints 2!
}
}
इस मामले में, यह 2 प्रिंट करता है! ये क्यों हो रहा है? क्या स्ट्रक्चर का एक ही प्रिंसिपल इंटरफ़ेस पर लागू नहीं होता है?
जब इसे इंटरफेस के रूप में संदर्भित किया जाता है तो यह बॉक्सिंग हो जाता है। लेकिन आम तौर पर structs को अपरिवर्तनीय बनाने के लिए सबसे अच्छा है या यदि आपको म्यूटेबिलिटी की आवश्यकता है तो आपको इसे कक्षा बनाना चाहिए। – juharr