मुझे लगता है कि बहुत से लोग यहां भ्रमित हो रहे हैं, यह विशेष मुद्दा यह समझने से संबंधित है कि मूल्य प्रकार के गुण मूल्य प्रकार (जैसे कि विधियों और इंडेक्सर्स) की एक प्रति लौटाते हैं, और मूल्य प्रकार के फ़ील्ड सीधे पहुंच जाते हैं । निम्नलिखित कोड ठीक वही करता है जो आप सीधे संपत्ति के बैकिंग क्षेत्र तक पहुँचकर प्राप्त करने की कोशिश कर रहे हैं (ध्यान दें: एक बैकिंग फ़ील्ड के साथ अपने क्रिया रूप में एक संपत्ति को व्यक्त करना एक ऑटो संपत्ति के बराबर है, लेकिन इसका फायदा है कि हमारे कोड में हम कर सकते हैं सीधे बैकिंग फ़ील्ड तक पहुंचें):
class Program
{
static void Main(string[] args)
{
var myClass = new MyClass();
myClass.SetOrigin();
Debug.Assert(myClass.Origin.X == 10); //succeeds
}
}
class MyClass
{
private Point _origin;
public Point Origin
{
get => _origin;
set => _origin = value;
}
public void SetOrigin()
{
_origin.X = 10; //this works
//Origin.X = 10; // fails with CS1612;
}
}
आपको जो त्रुटि मिल रही है वह अप्रत्यक्ष रूप से यह समझने का परिणाम है कि एक संपत्ति एक मूल्य प्रकार की एक प्रति लौटाती है। यदि आपको किसी मान प्रकार की प्रतिलिपि लौटा दी जाती है और आप इसे स्थानीय चर पर असाइन नहीं करते हैं, तो उस प्रतिलिपि में आपके द्वारा किए गए किसी भी परिवर्तन को कभी नहीं पढ़ा जा सकता है और इसलिए संकलक इसे एक त्रुटि के रूप में उठाता है क्योंकि यह जानबूझकर नहीं हो सकता है। यदि हम एक स्थानीय चर को कॉपी असाइन करते हैं तो हम X का मान बदल सकते हैं, लेकिन इसे केवल स्थानीय प्रतिलिपि पर बदला जाएगा, जो संकलन समय त्रुटि को ठीक करता है, लेकिन मूल संपत्ति को संशोधित करने का वांछित प्रभाव नहीं होगा। निम्न कोड इसे दिखाता है, क्योंकि संकलन त्रुटि हो गई है, लेकिन डीबग अभिकथन विफल हो जाएगा:
class Program
{
static void Main(string[] args)
{
var myClass = new MyClass();
myClass.SetOrigin();
Debug.Assert(myClass.Origin.X == 10); //throws error
}
}
class MyClass
{
private Point _origin;
public Point Origin
{
get => _origin;
set => _origin = value;
}
public void SetOrigin()
{
var origin = Origin;
origin.X = 10; //this is only changing the value of the local copy
}
}