जब Readonly का उपयोग करें और केवल गुण प्राप्त करें


100

.NET अनुप्रयोग में मुझे "रीडऑनली" गुणों का उपयोग कब करना चाहिए और कब मुझे "गेट" का उपयोग करना चाहिए। इन दोनों के बीच क्या अंतर है।

private readonly double Fuel= 0;

public double FuelConsumption
{
    get
    {
        return Fuel;
    }
}        

या

private double Fuel= 0;

public double FuelConsumption
{
     get
     {
          return Fuel;
     }
}

12
C #> 5 के लिए संपत्ति को कम किया जा सकता हैpublic double FuelConsumption => Fuel;
meJustAndrew

जवाबों:


121

केवल प्रापक के साथ एक संपत्ति बनाना आपकी संपत्ति को केवल किसी भी कोड के लिए पढ़ता है जो कक्षा के बाहर है।

हालाँकि आप अपनी कक्षा द्वारा प्रदान की गई विधियों का उपयोग करके मूल्य बदल सकते हैं:

public class FuelConsumption {
    private double fuel;
    public double Fuel
    {
        get { return this.fuel; }
    }
    public void FillFuelTank(double amount)
    {
        this.fuel += amount;
    }
}

public static void Main()
{
    FuelConsumption f = new FuelConsumption();

    double a;
    a = f.Fuel; // Will work
    f.Fuel = a; // Does not compile

    f.FillFuelTank(10); // Value is changed from the method's code
}

अपनी कक्षा के निजी क्षेत्र को सेट करना जैसा readonlyकि आप केवल एक बार (इनलाइन असाइनमेंट का उपयोग करके या क्लास कंस्ट्रक्टर में) फ़ील्ड मान सेट करने की अनुमति देता है। आप इसे बाद में बदल नहीं पाएंगे।

public class ReadOnlyFields {
    private readonly double a = 2.0;
    private readonly double b;

    public ReadOnlyFields()
    {
        this.b = 4.0;
    }
}

readonly वर्ग फ़ील्ड का उपयोग अक्सर उन चरों के लिए किया जाता है, जिन्हें कक्षा के निर्माण के दौरान आरंभीकृत किया जाता है, और बाद में इन्हें कभी नहीं बदला जाएगा।

संक्षेप में, अगर आपको यह सुनिश्चित करने की आवश्यकता है कि आपकी संपत्ति का मूल्य कभी भी बाहर से नहीं बदला जाएगा, लेकिन आपको इसे अपने वर्ग कोड के अंदर से बदलने में सक्षम होना चाहिए, "गेट-ओनली" संपत्ति का उपयोग करें।

यदि आपको एक मूल्य संग्रहीत करने की आवश्यकता है जो एक बार अपने प्रारंभिक मूल्य को सेट करने के बाद कभी नहीं बदलेगा, तो एक readonlyफ़ील्ड का उपयोग करें ।


14
कोड उदाहरण के लिए + 1। लेकिन यह स्पष्ट करने की आवश्यकता है कि "गेट-ओनली" गुण केवल वर्ग विधियों द्वारा संशोधित किए जा सकते हैं जब वे क्लास फ़ील्ड पर लपेटे जाते हैं। यदि वे सेटर नहीं हैं, तो उन्हें सीधे वर्ग विधियों द्वारा भी संशोधित नहीं किया जा सकता है। और ऐसा करने की कोशिश करने के परिणामस्वरूप एक संकलक त्रुटि होगी।
देवराज गढ़वी

13

C # 6 के रूप में आप एक लाइन में 'केवल-पढ़ने के लिए ऑटो-संपत्ति' की घोषणा कर सकते हैं और शुरू कर सकते हैं:

double FuelConsumption { get; } = 2;

आप कंस्ट्रक्टर से मान सेट कर सकते हैं लेकिन अन्य तरीके नहीं।


7

एक संपत्ति जिसमें केवल एक गेटर होता है, उसे आसानी से कहा जाता है। कारण कोई सेटर प्रदान नहीं किया जाता है, संपत्ति के मूल्य (बाहर से) को बदलने के लिए।

सी # एक कीवर्ड है है केवल पढ़ने के लिए , कि क्षेत्र (नहीं गुण) पर इस्तेमाल किया जा सकता है। एक फ़ील्ड जिसे "आसानी से" के रूप में चिह्नित किया गया है, उसे केवल एक बार एक निर्माण के दौरान (निर्माणकर्ता में) सेट किया जा सकता है।

private string _name = "Foo"; // field for property Name;
private bool _enabled = false; // field for property Enabled;

public string Name{ // This is a readonly property.
  get {
    return _name;  
  }
}

public bool Enabled{ // This is a read- and writeable property.
  get{
    return _enabled;
  }
  set{
    _enabled = value;
  }
} 

2

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

http://blog.ploeh.dk/2011/05/24/PokayokeDesignFromSmellToFragrance.aspx

मार्क के उदाहरण से लिया गया:

public class Fragrance : IFragrance
{
    private readonly string name;

    public Fragrance(string name)
    {
        if (name == null)
        {
            throw new ArgumentNullException("name");
        }

        this.name = name;
    }

    public string Spread()
    {
        return this.name;
    }
}

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


0

विधियों का सुझाव है कि मूल्य को वापस करने के लिए कुछ होना चाहिए, गुणों का सुझाव है कि मूल्य पहले से ही है। यह अंगूठे का एक नियम है, कभी-कभी आप एक संपत्ति चाहते हैं जो थोड़ा काम करता है (यानी Count), लेकिन आम तौर पर यह तय करने का एक उपयोगी तरीका है।

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