अपनी उत्कृष्ट पुस्तक, सीएलआर वाया सी # में, जेफरी रिक्टर ने कहा कि वह गुणों को पसंद नहीं करता है, और उनका उपयोग नहीं करने की सिफारिश करता है। उन्होंने कुछ कारण दिया, लेकिन मैं वास्तव में नहीं समझता। क्या कोई मुझे समझा सकता है कि मुझे संपत्तियों का उपयोग क्यों करना चाहिए या नहीं करना चाहिए? C # 3.0 में, स्वचालित गुणों के साथ, क्या यह बदलता है?
एक संदर्भ के रूप में, मैंने जेफरी रिक्टर की राय को जोड़ा:
• एक संपत्ति केवल-पढ़ने या केवल लिखने के लिए हो सकती है; क्षेत्र की पहुंच हमेशा पठनीय और लेखन योग्य होती है। यदि आप किसी संपत्ति को परिभाषित करते हैं, तो एक्सेसर के तरीकों को प्राप्त करना और सेट करना दोनों की पेशकश करना सबसे अच्छा है।
• एक संपत्ति विधि एक अपवाद फेंक सकती है; फ़ील्ड एक्सेस कभी भी अपवाद नहीं होता है।
• एक संपत्ति एक विधि के लिए एक बाहर या रेफरी पैरामीटर के रूप में पारित नहीं किया जा सकता है; एक क्षेत्र कर सकते हैं। उदाहरण के लिए, निम्न कोड संकलित नहीं होगा:
using System;
public sealed class SomeType
{
private static String Name
{
get { return null; }
set {}
}
static void MethodWithOutParam(out String n) { n = null; }
public static void Main()
{
// For the line of code below, the C# compiler emits the following:
// error CS0206: A property or indexer may not
// be passed as an out or ref parameter
MethodWithOutParam(out Name);
}
}
• एक संपत्ति विधि को निष्पादित करने में लंबा समय लग सकता है; फ़ील्ड एक्सेस हमेशा तुरंत पूरा होता है। गुणों का उपयोग करने का एक सामान्य कारण थ्रेड सिंक्रोनाइज़ेशन करना है, जो हमेशा के लिए थ्रेड को रोक सकता है, और इसलिए, यदि थ्रेड सिंक्रोनाइज़ेशन की आवश्यकता है, तो किसी प्रॉपर्टी का उपयोग नहीं किया जाना चाहिए। उस स्थिति में, एक विधि को प्राथमिकता दी जाती है। इसके अलावा, यदि आपकी कक्षा को दूरस्थ रूप से एक्सेस किया जा सकता है (उदाहरण के लिए, आपकी कक्षा System.MashalByRefObject से ली गई है), तो संपत्ति विधि को कॉल करना बहुत धीमा होगा, और इसलिए, एक विधि एक संपत्ति के लिए पसंद की जाती है। मेरी राय में, MarsBByRefObject से प्राप्त वर्गों को कभी भी गुणों का उपयोग नहीं करना चाहिए।
• यदि एक पंक्ति में कई बार कहा जाता है, तो एक संपत्ति विधि हर बार एक अलग मान लौटा सकती है; एक फ़ील्ड हर बार समान मूल्य देता है। System.DateTime वर्ग के पास एक रीडोनॉली नाउ प्रॉपर्टी है जो वर्तमान दिनांक और समय लौटाती है। हर बार जब आप इस प्रॉपर्टी को क्वेरी करते हैं, तो यह एक अलग मूल्य लौटाएगा। यह एक गलती है, और Microsoft की इच्छा है कि वे संपत्ति के बजाय अब एक विधि बनाकर वर्ग को ठीक कर सकते हैं।
• एक संपत्ति विधि के कारण दुष्प्रभाव हो सकते हैं; फ़ील्ड एक्सेस कभी नहीं करता है। दूसरे शब्दों में, एक प्रकार का उपयोगकर्ता किसी भी क्रम में एक प्रकार से परिभाषित विभिन्न गुणों को निर्धारित करने में सक्षम होना चाहिए, वह किसी भी प्रकार के किसी भी व्यवहार को नोट किए बिना चुनता है।
• एक संपत्ति विधि को अतिरिक्त मेमोरी की आवश्यकता हो सकती है या किसी ऐसी चीज का संदर्भ दे सकता है जो वास्तव में ऑब्जेक्ट की स्थिति का हिस्सा नहीं है, इसलिए रिटर्न की गई वस्तु को संशोधित करने से मूल वस्तु पर कोई प्रभाव नहीं पड़ता है; फ़ील्ड को क्वेरी करना हमेशा उस ऑब्जेक्ट का संदर्भ देता है जो मूल ऑब्जेक्ट की स्थिति का हिस्सा होने की गारंटी है। एक संपत्ति के साथ काम करना जो एक प्रति लौटाता है, डेवलपर्स के लिए बहुत भ्रमित हो सकता है, और यह विशेषता अक्सर दस्तावेज नहीं होती है।