मैं ऑटो-कार्यान्वित संपत्ति के बैकिंग चर का उपयोग कैसे कर सकता हूं?


79

पूर्व में हमने इस तरह की संपत्ति घोषित की थी:

public class MyClass
{
    private int _age;

    public int Age
    {
          get{ return _age;  }
          set{ _age = value; }
    }
}

अब हम कर सकते हैं:

public class MyClass
{
    public int Age {get; set;} 
}

मेरा प्रश्न यह है कि मैं इस संकेतन का उपयोग करके अपने द्वारा बनाए गए निजी चर का उपयोग कैसे कर सकता हूं?

मैं निजी चर का उपयोग करूंगा न कि सार्वजनिक अभिगमकर्ता 'एज' का। क्या निजी चर का उपयोग करने के लिए एक डिफ़ॉल्ट संकेतन है, या यह संभव नहीं है?


10
निजी बनाम सार्वजनिक एक्सेसर तक पहुँचने के इस मामले में क्या अंतर है? मुझे लगता है कि घोषित वर्ग में तर्क से भी सार्वजनिक अभिगमकर्ता तक पहुंचना सबसे अच्छा अभ्यास है। यदि आप कभी एक्सेसर में कुछ तर्क जोड़ते हैं तो आप अपने सभी कोड को बदलना नहीं चाहते हैं।
एरिक शूनओवर

@ spoon16 क्या आप मुझे एक्सेसर में तर्क जोड़ने और अपने सभी कोड को परिणामस्वरूप बदलने का उदाहरण दे सकते हैं। मैं वास्तव में इस हिस्से को समझ नहीं पाया।
ओजेन

जवाबों:


92

नए स्वचालित गुणों का उद्देश्य बॉयलरप्लेट कोड की मात्रा को कम करना है जिसे आपको लिखने की आवश्यकता है जब आपके पास बस एक साधारण संपत्ति होती है जिसे पाने या सेट में किसी विशेष तर्क की आवश्यकता नहीं होती है।

यदि आप इन गुणों का उपयोग करने वाले निजी सदस्य का उपयोग करना चाहते हैं, तो यह आमतौर पर कुछ कारणों से होता है:

  • आपको बस एक साधारण गेट / सेट से अधिक की जरूरत है - इस मामले में, आपको इस सदस्य के लिए स्वचालित गुणों का उपयोग करने से बचना चाहिए।
  • आप प्राप्त या सेट के माध्यम से प्रदर्शन के हिट से बचने के लिए और सीधे सदस्य का उपयोग करना चाहते हैं - इस मामले में, मुझे आश्चर्य होगा कि क्या वास्तव में प्रदर्शन हिट था। सरल मिल / सेट सदस्य इनलाइन में बहुत आसान होते हैं, और मेरे (संयुक्त रूप से सीमित) परीक्षण में मुझे स्वचालित गुणों का उपयोग करने और सीधे सदस्य तक पहुंचने के बीच कोई अंतर नहीं मिला है।
  • आप केवल सार्वजनिक रीड एक्सेस (यानी सिर्फ एक 'गेट') प्राप्त करना चाहते हैं और वर्ग सीधे सदस्य को लिखते हैं - इस मामले में, आप अपनी स्वचालित संपत्ति में एक निजी सेट का उपयोग कर सकते हैं। अर्थात

    public class MyClass
    {
        public int Age {get; private set;} 
    }

यह आमतौर पर स्वचालित गुणों द्वारा उपयोग किए जाने वाले बैकिंग क्षेत्र में सीधे जाने के लिए अधिकांश कारणों को शामिल करता है।


यह सच है - वे गेंदबाज कोड को कम करते हैं और मैं यह भी स्वीकार करूंगा कि उन्हें आपको परीक्षण करने की आवश्यकता है। कुछ लोग यह तर्क दे सकते हैं कि आपको मैनुअल गेट / सेट का परीक्षण करने की आवश्यकता है, लेकिन ऑटो गुणों के साथ नहीं क्योंकि आप ढांचे पर भरोसा कर सकते हैं।
डैनियल ऑगर

3
यहां कोड सैंपल गलत है। यह सार्वजनिक वर्ग होना चाहिए MyClass {सार्वजनिक int आयु {प्राप्त करें; निजी सेट;}} मैं इस जवाब से सहमत हूं। आप निजी क्षेत्र तक नहीं पहुँच सकते हैं और यदि आपको आवश्यकता है, तो आपको पहली बार में स्वचालित गुणों का उपयोग नहीं करना चाहिए।
hwiechers

hwiechers, उस के लिए धन्यवाद - मैंने वह संपादन किया था, लेकिन जब मैंने फ़िक्सिंग को ठीक करने की कोशिश की तो मुझे फिर से पेस्ट करना चाहिए और कोड के गलत ब्लॉक को हटा दिया। दोहे!
विल्का

आमतौर पर POCO ऑब्जेक्ट्स में उपयोग किया जाता है
RobS

23

स्वचालित गुणों के आपके उपयोग का तात्पर्य है कि आपको संपत्ति के लिए किसी भी प्रकार की सेटिंग / सेटिंग तर्क की आवश्यकता नहीं है, इस प्रकार एक निजी बैकिंग चर अनावश्यक है।

यदि आपकी कक्षा में कोई जटिल तर्क है, तो स्वचालित गुणों का उपयोग न करें। private int _ageजैसा कि आप सामान्य रूप से करते हैं, बस जाएं और सामान्य गेटर्स / सेटर करें।

IMO, स्वचालित रूप से फेंकने योग्य वस्तुओं या अस्थायी डेटा कैप्सूल को लागू करने के लिए अधिक अनुकूल हैं जैसे:

public class TempMessage {
    public int FromID { get; set; }
    public int ToID { get; set; }
    public string Message { get; set; }
}

जहाँ आपको बहुत तर्क की आवश्यकता नहीं है।


आपकी कक्षा में जटिल तर्क जोड़ने से यह प्रभावित होगा कि आपने उस वर्ग के भीतर स्वचालित गुणों का उपयोग किया है या नहीं?
एरिक शूनओवर

एक संगति से अधिक बात ... यदि आपके पास जटिल तर्क है तो आप इसे निजी बैकिंग चर प्रति OO प्रथाओं से एक्सेस करना चाहेंगे .. और यदि आप स्वचालित गुणों का उपयोग करते हैं तो ... उन गुणों तक पहुँचने में असंगतताएँ होंगी । चूँकि कुछ में अंडरस्कोर उपसर्ग होगा और कुछ नहीं होगा।
चक्र

12

इस सिंटैक्स को आमतौर पर "सिंटैक्स शुगर" कहा जाता है, जिसका अर्थ है कि संकलक उस सिंटैक्स को लेता है और इसे किसी और चीज़ में अनुवाद करता है। आपके उदाहरण में, कंपाइलर कोड उत्पन्न करेगा जो कुछ इस तरह दिखता है:

[CompilerGenerated]
private int <Age>k_BackingField;

public int Age
{
   [CompilerGenerated]
   get
   {
      return this.<Age>k_BackingField;
   }
   [CompilerGenerated]
   set
   {
      this.<Age>k_BackingField = value;
   }

यहां तक ​​कि यह सब जानते हुए भी, आप शायद बैकिंग फ़ील्ड को सीधे एक्सेस कर सकते हैं, लेकिन स्वचालित गुणों का उपयोग करने के उद्देश्य को पराजित करते हैं। मैं शायद यहां कहता हूं क्योंकि आप तब एक कार्यान्वयन विवरण पर निर्भर करते हैं जो भविष्य में सी # संकलक के किसी भी रिलीज में बदल सकता है।


10

क्या होता है के दृश्यों के पीछे एक निजी सदस्य चर का इंजेक्शन होता है, जो <> k__AutomaticallyGeneratedPropertyField # के साथ उपसर्ग करता है

से सी # 3.0 स्वत: गुण समझाया

हालाँकि उस निजी सदस्य को सीधे इस्तेमाल करना संभव हो सकता है, लेकिन यह बहुत ही हैक्यी और अनावश्यक है।


7

आपको नहीं करना चाहिए, और इसकी आपको बहुत संभावना नहीं है। यदि आपको संपत्ति का उपयोग करने की आवश्यकता है, तो सार्वजनिक संपत्ति का उपयोग करें (उदाहरण के लिए। यह)। सार्वजनिक संपत्ति का समर्थन करने वाले निजी क्षेत्र के बारे में कुछ भी विशेष नहीं है, संपत्ति के लिए प्राथमिकता में इसका उपयोग करना सिर्फ अंधविश्वास है।


1
मैं हमेशा सोचता था कि स्वचालित गुणों के बिंदु क्या थे। यदि आपके पास अपने गेटर्स में कोई विशेष तर्क नहीं है और बसते हैं तो उन्हें बिल्कुल क्यों?
मैथ्यू लॉक

4
@ मैथ्यू लॉक लचीलापन। जब तक आप एक ही समय में सभी क्लाइंट कोड नहीं बदल देते, तब तक आप उस डिज़ाइन में लॉक हो जाते हैं। लेकिन एक संपत्ति के साथ यदि आप इसे "छद्म-क्षेत्र" से एक गणना की गई संपत्ति में बदलने का फैसला करते हैं, या यदि आप सेटर पर दावे और जांच को जोड़ने का फैसला करते हैं, या क्या-क्या-आप हैं, तो आप ऐसा पारदर्शी तरीके से कर सकते हैं। यदि आप लाइब्रेरी कोड लिख रहे हैं तो यह और भी उपयोगी है, जहाँ आप सभी क्लाइंट कोड को नियंत्रित नहीं कर सकते।
कील

2

आप नहीं कर सकते, यह एक आईडीई सुविधा के विपरीत एक भाषा सुविधा है। ईमानदार होने के लिए मैं आपके लिए निजी चर जोड़ने के लिए IDE पसंद करूंगा। मैं मानता हूं कि वर्ग के लिए आंतरिक रूप से सार्वजनिक चर बिंदु का उपयोग करना अपने स्वयं के चर तक पहुंचने के लिए थोड़ा अजीब है। इसलिए मैं इस नई सुविधा का उपयोग खुद नहीं करता।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.