यह एक लीक से हटकर मामला है। एक संपत्ति वास्तव में एक विधि है, इंडेक्सर के लिए प्राप्त और सेट एक्सेसर्स get_Index () और set_Index विधियों के लिए संकलित हो जाते हैं। कंपाइलर उस तथ्य को छिपाते हुए एक भयानक काम करता है, यह उदाहरण के लिए स्वचालित रूप से संबंधित set_Xxx () पद्धति के लिए एक संपत्ति में असाइनमेंट का अनुवाद करता है।
लेकिन जब आप संदर्भ द्वारा विधि पैरामीटर पास करते हैं तो यह ऊपर जाता है। यह JIT संकलक को पास किए गए तर्क की मेमोरी लोकेशन को पॉइंटर पास करने की आवश्यकता है। समस्या यह है कि एक नहीं है, एक संपत्ति के मूल्य को निर्दिष्ट करने के लिए सेटर विधि को कॉल करना आवश्यक है। कहा जाता विधि एक पारित चर बनाम एक पारित संपत्ति के बीच का अंतर नहीं बता सकता है और इस प्रकार यह नहीं जान सकता है कि विधि कॉल की आवश्यकता है या नहीं।
उल्लेखनीय है कि यह वास्तव में VB.NET में काम करता है। उदाहरण के लिए:
Class Example
Public Property Prop As Integer
Public Sub Test(ByRef arg As Integer)
arg = 42
End Sub
Public Sub Run()
Test(Prop) '' No problem
End Sub
End Class
VB.NET कंपाइलर C # में व्यक्त रन विधि के लिए स्वचालित रूप से इस कोड को उत्पन्न करके इसे हल करता है:
int temp = Prop;
Test(ref temp);
Prop = temp;
जो कि वर्कअराउंड है जिसे आप भी इस्तेमाल कर सकते हैं। यह निश्चित नहीं है कि C # टीम ने एक ही दृष्टिकोण का उपयोग क्यों नहीं किया। संभवतः क्योंकि वे संभावित रूप से महंगे गेट्टर और सेटर कॉल को छिपाना नहीं चाहते थे। या सेटर द्वारा पूरी तरह से अनुचित व्यवहार करने पर आपको मिलेगा कि सेटर के साइड-इफेक्ट्स हैं जो संपत्ति के मूल्य को बदलते हैं, वे असाइनमेंट के बाद गायब हो जाएंगे। C # और VB.NET के बीच क्लासिक अंतर है, C # "कोई आश्चर्य नहीं" है, VB.NET "यह काम करें यदि आप कर सकते हैं"।