निजी वासियों को समझना


90

मुझे निजी बसने की आवश्यकता नहीं है जो C # 2 के साथ शुरू हुई थी।

मेरे लिए एक सेटर विधि होने से उपयोगकर्ता उस कक्षा में कुछ चर निर्धारित कर सकता है। ऐसा करते हुए, हम उपयोगकर्ताओं के लिए सीधे चर को उजागर नहीं करेंगे। इसके बजाय हम उन्हें इस सार्वजनिक सेटर विधि के माध्यम से करते हैं।

यह मेरे लिए "एनकैप्सुलेशन" का उपयोग कर रहा है। वहाँ कुछ तर्क हैं जो दावा करते हैं कि निजी बसने वाले आपको एनकैप्सुलेशन लागू करने देंगे।

क्या मैं सार्वजनिक सेटर विधियों का उपयोग करके एनकैप्सुलेशन का उपयोग नहीं कर रहा हूं? हमें निजी बसने की आवश्यकता क्यों है?

निजी बसाने वाले अपरिवर्तनीय वर्ग और वर्ग के बीच क्या अंतर है?


1
मुझे निजी लोगों से बड़ा प्यार था - मुझे फिर से बदसूरत वर्गों में मदद की। वे एक बार में गैर-स्थिर आवृत्ति चर की घोषणा करना और सेट करना असंभव बनाते हैं: private File settingsFile = null;और फिर एक निर्माणकर्ता में if (settingsFile == null) { settingsFile = GetSettingsFile() };:। इस तरह के कोड को फिर से भरने से मुझे कभी-कभी रोना पड़ता है :)। सिर्फ इसलिए कि आप कंस्ट्रक्टर से पहले एक सदस्य सेट कर सकते हैं, इसका मतलब यह नहीं है कि आपको कई कंस्ट्रक्टर के साथ, इसके लिए, तर्क का पालन करने के लिए यह HARD बनाता है। निजी सेटर आपको कंस्ट्रक्टर के अंदर या बाद में मान सेट करने के लिए मजबूर करते हैं।
— हामिश ग्रुबीजन

जवाबों:


261

तर्क में।

एक निजी सेटर की उपस्थिति है क्योंकि आप ऑटो संपत्ति का उपयोग कर सकते हैं:

public int MyProperty { get; set; }

यदि आप इसे आसानी से बनाना चाहते हैं तो आप क्या करेंगे?

public int MyProperty { get; }

ओह बकवास!! मैं इसे अपनी कक्षा से एक्सेस नहीं कर सकता; मुझे इसे एक सामान्य संपत्ति की तरह बनाना चाहिए:

private int myProperty;
public int MyProperty { get { return myProperty; } }

हम्म ... लेकिन मैंने "ऑटो संपत्ति" सुविधा खो दी ...

public int MyProperty { get; private set; }

एएचएचएच .. यह बेहतर है !!


धन्यवाद। यह फिर से समझ में आता है
— Dene

3
@ktutnik आपके द्वारा किए गए तरीके को पूरा करने के लिए धन्यवाद। यह मेरे लिए, अब भी समझ में आता है!
— विवेक एम। चावला

3
बहुत बढ़िया सचित्र जवाब।
— imnk

3
Oh crap!! I can't access it from my own classC # 6.0 शुरू करना यह केवल इनिशियलाइज़ेशन चरण के बाहर सच है। मेरा उत्तर देखें stackoverflow.com/a/34223746/198797
— tsemer

1
C # 6 के साथ # tsemer का उत्तर जोड़ना, के {get; }बराबर नहीं है { get; private set; }। पहला तरीका के लिए property.GetSetMethod(true)रिटर्न nullऔर बाद true। इसने मुझे चौंका दिया।
— 16:59

37

एक निजी सेटर उपयोगी है यदि आपके पास केवल पढ़ने के लिए संपत्ति है और बैकिंग चर को स्पष्ट रूप से घोषित नहीं करना चाहते हैं।

इसलिए:

public int MyProperty
{
    get; private set;
}

के समान है:

private int myProperty;
public int MyProperty
{
    get { return myProperty; }
}

गैर-ऑटो कार्यान्वित गुणों के लिए यह आपको भीतर से संपत्ति स्थापित करने का एक सुसंगत तरीका देता है अपनी कक्षा के ताकि यदि आपको सत्यापन आदि की आवश्यकता हो तो आपके पास केवल एक ही स्थान हो।

आपके अंतिम प्रश्न का उत्तर देने के लिए MSDN के पास निजी बाशिंदों पर यह कहना है:

हालांकि, छोटी कक्षाओं या संरचनाओं के लिए जो केवल मानों (डेटा) के एक सेट को एनकैप्सुलेट करते हैं और बहुत कम या कोई व्यवहार नहीं करते हैं, यह सेट एक्सेसर को निजी घोषित करके वस्तुओं को अपरिवर्तनीय बनाने की सिफारिश की जाती है।

ऑटो कार्यान्वित गुणों पर MSDN पृष्ठ से


1
मुझे खेद है कि मैं अभी भी निजी बसने के कारण अतिरिक्त मूल्य नहीं देखता। यदि हम सेटर को उजागर नहीं करना चाहते हैं तो हमारे पास केवल गेट्टर है। यदि हम सत्यापनकर्ता जोड़ना चाहते हैं तो हमारे पास एक सार्वजनिक सेटर हो सकता है और इसके लिए सत्यापन जोड़ सकता है। हमें एक सेटर की आवश्यकता क्यों है जो सुलभ नहीं है? जिस तरह से मैं समझता हूं कि यह "इस कार को ले लो, लेकिन आप इसे ड्राइव नहीं कर सकते" आप मुझे कार क्यों देना चाहते हैं अगर मैं इसे वैसे भी ड्राइव नहीं करने जा रहा हूं
— Dene

@Dene - आप निश्चित रूप से ऐसा कर सकते हैं, क्योंकि यह गलत नहीं है। ऑटो कार्यान्वित गुण होना अनिवार्य नहीं है।
— ChrisF

मुझे पता है कि मैंने इसे व्यक्त करने के तरीके में कुछ भी गलत नहीं है। यह मेरे लिए C # 2 द्वारा की गई कामचलाऊ व्यवस्था की सराहना करने के लिए है। इसके चारों ओर बहुत प्रचार प्रतीत होता है, लेकिन मैं इसे महसूस नहीं कर सकता या मूल्य नहीं देख सकता।
— डेने

@, मैं इसके बारे में प्रचार के सभी याद किया। लेकिन, जब मैंने आखिरकार देखा कि ऐसा करना संभव है, तो मुझे खुशी हुई क्योंकि मुझे पता था कि .NET 1.1 युग से कुछ लंबी कक्षाओं को कैसे साफ किया जाए। हालांकि आप संभवतः उस संपत्ति के मूल्य का उपयोग कर सकते हैं जो अभी तक सेट नहीं किया गया है, ऐसा करना एक उदाहरण सदस्य चर के मूल्य का उपयोग करने की तुलना में कम स्वाभाविक है जिसे शून्य पर सेट किया गया है।
— हामिश ग्रुबीजन

यह कोड को सरल करता है। बस ऑटो गुणों की तरह। C # के बाद के कई अपडेट्स कोड को अधिक ट्रिब्यूट बनाने के बारे में हैं और इसलिए पठनीय हैं। आप अभी भी चीजों को दूसरे तरीके से कर सकते हैं यदि आप चाहते हैं - हालांकि पीछे की संगतता भी एक बड़ा उद्देश्य है। मुझे लगता है कि यह स्वाद की बात है।
— नीको

18

बल्कि सरल है। निजी बसने वाले आपको केवल-पढ़ने के लिए सार्वजनिक या संरक्षित गुण बनाने की अनुमति देते हैं।

बस। यही एकमात्र कारण है।

हां, आप केवल गटर को निर्दिष्ट करके एक रीड-ओनली प्रॉपर्टी बना सकते हैं, लेकिन ऑटो-इम्प्लांटेड प्रॉपर्टीज के साथ आपको गेट और सेट दोनों को निर्दिष्ट करना आवश्यक है, इसलिए यदि आप चाहते हैं कि एक ऑटो-इम्प्लीमेंटेड प्रॉपर्टी केवल रीड-ओनली हो, तो आपको इसका उपयोग करना होगा निजी बाशिंदे। इसे करने का कोई और तरीका नहीं है।

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


2
धन्यवाद "यदि आप चाहते हैं कि ऑटो-कार्यान्वित संपत्ति केवल-पढ़ने के लिए हो, तो आपको निजी बसने वालों का उपयोग करना चाहिए"। इससे मुझे समझ में आता है
— Dene

17

C # 6.0 की शुरूआत और ऑटो-प्रॉपर्टी इनिशियलाइज़र्स के लिए सिंटैक्स के साथ , निजी बसने वालों को उन संपत्तियों की ज़रूरत नहीं है जो केवल इनिशियलाइज़ेशन पर या तो इनलाइन या कंस्ट्रक्टर के भीतर सेट हैं।

ये नए वाक्यविन्यास अब संकलन करते हैं:

इनलाइन इनिशियलाइज्ड प्रॉपर्टी

public class MyClass1 {
  public string MyProperty { get; } = "Aloha!"
}

कंस्ट्रक्टर ने प्रारंभिक संपत्ति बनाई

public class MyClass2 {
  public string MyProperty { get; }

  public MyClass2(string myProperty) {
    MyProperty = myProperty;
  }
}

3
@Ziggler, वास्तव में यह नहीं है। और न ही ओपी इसे पूछता है। वह सिर्फ उन्हें होने की जरूरत नहीं समझता है। यह उत्तर देता है: "अब आपको उन्हें इस परिदृश्य में रखने की आवश्यकता नहीं है"।
— tsemer

6

मुझे निजी बसने की आवश्यकता नहीं है जो C # 2 से शुरू हुई है।

उदाहरण के लिए, इनवॉइस वर्ग उपयोगकर्ता को आइटम गुण से आइटम जोड़ने या निकालने की अनुमति देता है, लेकिन यह उपयोगकर्ता को आइटम संदर्भ बदलने से अनुमति नहीं देता है (यानी, उपयोगकर्ता आइटम को किसी अन्य आइटम सूची ऑब्जेक्ट उदाहरण के लिए असाइन नहीं कर सकता है)।


public class Item
{
  public string item_code;
  public int qty;

  public Item(string i, int q)
  {
    this.item_code = i;
    this.qty = q;
  }
}

public class Invoice
{
  public List Items { get; private set; }

  public Invoice()
  {
    this.Items = new List();
  }
}

public class TestInvoice
{
  public void Test()
  {
    Invoice inv = new Invoice();
    inv.Items.Add(new Item("apple", 10));

    List my_items = new List();
    my_items.Add(new Item("apple", 10));

    inv.Items = my_items;   // compilation error here.
  }
}

+1 यह उजागर करने के लिए कि संपत्तियों को सार्वजनिक गटर के माध्यम से हेरफेर किया जा सकता है, भले ही उनके पास एक निजी सेटर हो।
— user1725145

4

उदाहरण के लिए कहें, आप संपत्ति के माध्यम से वास्तविक चर को स्टोर नहीं करते हैं या कुछ की गणना करने के लिए मूल्य का उपयोग नहीं करते हैं।

ऐसे मामले में आप या तो अपनी गणना करने के लिए एक विधि बना सकते हैं

private void Calculate(int value)
{
 //...
}

या आप ऐसा कर सकते हैं

public int MyProperty {get; private set;}

उन मामलों में मैं बाद में उपयोग करने की सिफारिश करूंगा, क्योंकि गुण प्रत्येक सदस्य तत्व को बरकरार रखता है।

इसके अलावा, अगर आप यह भी कहते हैं कि आप एक परिवर्तनीय के साथ संपत्ति का नक्शा बनाते हैं। ऐसे मामले में, अपने कोड के भीतर आप इस तरह लिखना चाहते हैं:

public int myprop;
public int MyProperty {get { return myprop;}}

... ...

this.myprop = 30;

... ...
if(this.MyProperty > 5)
   this.myprop = 40;

उपरोक्त कोड भयानक लग रहा है क्योंकि प्रोग्रामर को सेट के लिए MyProperty का उपयोग करने के लिए हमेशा सतर्क रहना चाहिए और सेट के लिए myprop चाहिए।

निरंतरता के लिए राइडर आप एक निजी सेटर का उपयोग कर सकते हैं जो प्रॉपर्टी को आसानी से बाहर कर देता है जबकि आप अपने कोड के अंदर अपने सेटर का उपयोग कर सकते हैं।


3

मुझे लगता है कि कुछ लोगों ने इसके चारों ओर नृत्य किया है, लेकिन मेरे लिए, निजी बसने वालों का मूल्य यह है कि आप एक वर्ग के भीतर भी, संपत्ति के व्यवहार को रोक सकते हैं। जैसा कि अभिषेक ने कहा, यदि आप हर बार संपत्ति में बदलाव के लिए संपत्ति में बदलाव की घटना चाहते हैं, लेकिन आप नहीं चाहते कि संपत्ति सार्वजनिक रूप से पढ़ें / लिखें, तो आपको या तो निजी सेटर का उपयोग करना चाहिए, या आपको उठाना चाहिए कहीं भी आप बैकिंग फ़ील्ड को संशोधित करते हैं। उत्तरार्द्ध त्रुटि प्रवण है क्योंकि आप भूल सकते हैं। संबंधित रूप से, अगर कुछ गणना में संपत्ति के मूल्य के परिणामों को अद्यतन किया जा रहा है या किसी अन्य क्षेत्र को संशोधित किया जा रहा है, या किसी चीज़ का आलसी आरंभ किया जा रहा है, तो आप इसे निजी सेटर में लपेटना चाहते हैं, बजाय इसके कि आप इसे हर जगह याद रखें। बैकिंग फ़ील्ड का उपयोग।


2

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

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

ये मामले हालांकि ज्यादातर उन वर्गों के लिए प्रतिबंधित हैं जो ज्यादातर "सादे पुराने डेटा" हैं। वे इस संबंध में बहुत दिलचस्प नहीं हैं, इसलिए उनके बारे में पर्याप्त है।

अन्य मामलों में, अन्य भाषाओं में, एक के पास एक गेटर और सेटर विधि होगी, कुछ ऐसा होगा जो int getId()एक मूल्य प्राप्त करना और void setId(int val)इसे अपडेट करना होगा।

गुण हमें ऐसे तरीकों के माध्यम से पढ़ने और लिखने के लिए एक ही वाक्यविन्यास का उपयोग करते हैं जैसा कि हम एक क्षेत्र को पढ़ने और लिखने के लिए उपयोग करेंगे। यह एक अच्छा संश्लिष्ट चीनी है, हालांकि महत्वपूर्ण नहीं है।

(वास्तव में, जिस तरह से प्रतिबिंब काम करता है और ऐसे मामलों के कारण जैसे कि DataBinder.Evalयह एक संपत्ति के लिए भी आसान हो सकता है जब एक क्षेत्र ठीक काम करेगा, लेकिन यह एक और मामला है)।

जब तक निजी बसर शुरू नहीं किए जाते (वास्तव में, C # 2 के साथ क्या बदला है, एक निजी सेटर और एक ही ब्लॉक में एक सार्वजनिक या संरक्षित गेट्टर होने के लिए वाक्यविन्यास है), हमारे पास निजी सेटर का काम करने के लिए एक निजी तरीका हो सकता है, इसलिए निजी बसने वास्तव में आवश्यक नहीं हैं। वे हालांकि काम कर रहे हैं, इसलिए सिर्फ सियाटिक चीनी के साथ, वे बहुत उपयोगी हैं।

एनकैप्सुलेशन एक मामला है कि क्या आपके सेटर (या गेटर्स) सार्वजनिक, निजी, संरक्षित या आंतरिक हैं, लेकिन क्या वे उचित हैं । प्रत्येक क्षेत्र के निजी (और उस मामले के लिए readonly) होने के डिफ़ॉल्ट के साथ शुरू करें और फिर आवश्यक रूप से उन सदस्यों (चाहे गुण या विधियाँ) को जोड़ें जो उन क्षेत्रों को बदल देते हैं, और यह सुनिश्चित करते हैं कि ऑब्जेक्ट वैसा ही बना रहे जैसा वे बदलते हैं । यह सुनिश्चित करता है कि एक वर्ग ' अपरिवर्तनीय रखा गया है, जिसका अर्थ है कि राज्यों के वैध सेट का वर्णन करने वाले नियम कभी भी टूटे नहीं जा सकते (निर्माणकर्ता यह सुनिश्चित करते हुए मदद करते हैं कि यह ऐसे वैध राज्य में शुरू होता है)।

आपके अंतिम प्रश्न के रूप में, अपरिवर्तनीय होने का मतलब है कि किसी वर्ग की कोई सार्वजनिक, संरक्षित या आंतरिक बसाहट नहीं है और कोई भी सार्वजनिक, संरक्षित या आंतरिक तरीके नहीं हैं जो किसी भी क्षेत्र को बदलते हैं। इस की डिग्री हैं, C # में तीन डिग्री संभव हैं:

  1. सभी श्रेणी के उदाहरण क्षेत्र हैं readonly, इसलिए निजी कोड भी इसे बदल नहीं सकते हैं। यह अपरिवर्तनीय होने की गारंटी देता है (कुछ भी जो इसे बदलने की कोशिश नहीं करता है वह संकलन नहीं करेगा) और संभवतः इसके पीछे अनुकूलन किया जा सकता है।

  2. एक वर्ग बाहर से अपरिवर्तनीय है क्योंकि कोई भी सार्वजनिक सदस्य कुछ भी नहीं बदलता है, लेकिन readonlyअंदर से परिवर्तित नहीं होने के उपयोग की गारंटी नहीं है।

  3. एक वर्ग बाहर से देखे जाने के रूप में अपरिवर्तनीय है, हालांकि कुछ राज्य कार्यान्वयन विस्तार के रूप में बदलते हैं। जैसे कि एक फ़ील्ड को याद किया जा सकता है, और इसलिए बाहर से इसे प्राप्त करने के प्रयास के दौरान बस उसी मूल्य को पुनः प्राप्त करता है, पहला ऐसा प्रयास वास्तव में इसकी गणना करता है और फिर बाद के प्रयासों पर पुनर्प्राप्ति के लिए संग्रहीत करता है।


1

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


1

हां, आप संपत्तियों का उपयोग करके एनकैप्सुलेशन का उपयोग कर रहे हैं, लेकिन संपत्तियों को कैसे पढ़ा और लिखा जाता है, इस पर नियंत्रण रखने की तुलना में एन्कैप्सुलेशन की अधिक बारीकियां हैं। वर्ग के बाहर से सेट की जाने वाली संपत्ति को अस्वीकार करना मजबूती और प्रदर्शन दोनों के लिए उपयोगी हो सकता है।

एक अपरिवर्तनीय वर्ग एक ऐसा वर्ग है जो एक बार बनने के बाद नहीं बदलता है, इसलिए गुणों की रक्षा के लिए निजी बसने वालों (या बिल्कुल नहीं बसने वाले) की आवश्यकता होती है।

निजी आश्रितों को प्रॉपर्टी शॉर्टहैंड के साथ अधिक बार उपयोग में लाया गया जो C # 3 में शुरू किया गया था। C # 2 में सेटर को अक्सर छोड़ा गया था, और सेट होने पर सीधे निजी डेटा एक्सेस किया गया था।

यह संपत्ति:

public int Size { get; private set; }

के समान है:

private int _size;
public int Size {
  get { return _size; }
  private set { _size = value; }
}

को छोड़कर, बैकिंग चर का नाम आंतरिक रूप से संकलक द्वारा बनाया गया है, इसलिए आप इसे सीधे एक्सेस नहीं कर सकते।

शॉर्टहैंड प्रॉपर्टी के साथ प्राइवेट सेटर को रीड-ओनली प्रॉपर्टी बनाने की जरूरत होती है, क्योंकि आप सीधे बैकिंग वेरिएबल तक नहीं पहुंच सकते।


यदि मैं सही ढंग से याद करता हूं, तो आपके पास C # 2.0 से पहले getऔर एक्सेस एक्सेस संशोधक अलग-अलग नहीं हो सकते हैं set। इसके अलावा, मुझे लगता है कि आप 2.0 और 3.0 का मिश्रण कर रहे हैं, क्योंकि आपके द्वारा संदर्भित ऑटो-कार्यान्वित शॉर्टहैंड 3.0 था।
— एंथनी पेग्राम

1

मुझे निजी बसने की आवश्यकता नहीं है जो C # 2 से शुरू हुई है।

उदाहरण का उपयोग करें:

मेरे पास एक एप्लिकेशन ऑब्जेक्ट का एक उदाहरण 'UserInfo'है जिसमें एक संपत्ति हैSessionTokenIDV1 जो मैं अपनी कक्षा के उपभोक्ताओं के लिए उजागर नहीं करना चाहता हूं।

मुझे अपनी कक्षा से उस मूल्य को निर्धारित करने की क्षमता भी चाहिए।

मेरा समाधान यह था कि संपत्ति को दिखाए गए तरीके से समझाया जाए और सेटर को निजी बनाया जाए ताकि मैं सत्र टोकन का मूल्य निर्धारित कर सकूं, बिना कोडिंग कोड को भी सेट करने की अनुमति दिए (या इसे मेरे मामले में भी देखें)

public class UserInfo
{
   public String SessionTokenIDV1 { get; set; }

}


public class Example
{
  // Private vars
  private UserInfo _userInfo = new UserInfo();

  public string SessionValidV1
  {
    get { return ((_userInfo.SessionTokenIDV1 != null) && (_userInfo.SessionTokenIDV1.Length > 0)) ? "set" : "unset"; }
    private set { _userInfo.SessionTokenIDV1 = value; }
  }
}

संपादित करें: फिक्स्ड कोड टैग संपादित करें: उदाहरण में त्रुटियां थीं जिन्हें ठीक कर दिया गया है


-1

Https://www.dotnetperls.com/property को क्रेडिट ।

निजी बसने वाले केवल पढ़ने के क्षेत्र के समान हैं। उन्हें केवल कंस्ट्रक्टर में सेट किया जा सकता है। यदि आप बाहर से सेट करने का प्रयास करते हैं तो आपको संकलन समय त्रुटि मिलती है।

public class MyClass
{
    public MyClass()
    {
        // Set the private property.
        this.Name = "Sample Name from Inside";
    }
     public MyClass(string name)
    {
        // Set the private property.
        this.Name = name;
    }
    string _name;
    public string Name
    {
        get
        {
            return this._name;
        }
        private set
        {
            // Can only be called in this class.
            this._name = value;
        }
    }
}

class Program
{
    static void Main()
    {
        MyClass mc = new MyClass();
        Console.WriteLine(mc.name);

        MyClass mc2 = new MyClass("Sample Name from Outside");
        Console.WriteLine(mc2.name);
    }
}

कृपया नीचे स्क्रीन शॉट देखें जब मैंने इसे कक्षा के बाहर से सेट करने का प्रयास किया।

यहां छवि विवरण दर्ज करें

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