2011-08-16 12 views
5

मैं एक अपरिवर्तनीय और परिवर्तनीय प्रकार के बीच अंतर का प्रदर्शन करने के लिए एक त्वरित स्निपेट लिखने की कोशिश कर रहा हूं। क्या यह कोड आपके लिए सही प्रतीत होता है?अपरिवर्तनीय बनाम उत्परिवर्तनीय सी #

class MutableTypeExample 
{ 
    private string _test; //members are not readonly 
    public string Test 
    { 
     get { return _test; } 
     set { _test = value; } //class is mutable because it can be modified after being created 
    } 

    public MutableTypeExample(string test) 
    { 
     _test = test; 
    } 

    public void MakeTestFoo() 
    { 
     this.Test = "FOO!"; 
    } 
} 

class ImmutableTypeExample 
{ 
    private readonly string _test; //all members are readonly 
    public string Test 
    { 
     get { return _test; } //no set allowed 
    } 

    public ImmutableTypeExample(string test) //immutable means you can only set members in the consutrctor. Once the object is instantiated it cannot be altered 
    { 
     _test = test; 
    } 

    public ImmutableTypeExample MakeTestFoo() 
    { 
     //this.Test = "FOO!"; //not allowed because it is readonly 
     return new ImmutableTypeExample("FOO!"); 
    } 
} 
+0

यह वर्ग नहीं है जो उत्परिवर्तनीय है लेकिन एक क्षेत्र है। जब तक 'readonly' फ़ील्ड केवल कन्स्ट्रक्टर कोड या प्रारंभिक समय पर असाइन किए जाते हैं, तब तक आप कक्षा में' readonly' और "सामान्य" फ़ील्ड को मिश्रित कर सकते हैं। – Matten

+0

'ImmutableTypeExample MakeTestFoo() 'ज्यादा समझ में नहीं आता है। क्या यह स्थिर होना चाहिए? –

उत्तर

14

यूप, जो उचित दिखता है।

हालांकि, मैं भी "लीकी" उत्परिवर्तन के बारे में बात करता हूं। उदाहरण के लिए:

public class AppearsImmutableButIsntDeeplyImmutable 
{ 
    private readonly StringBuilder builder = new StringBuilder(); 
    public StringBuilder Builder { get { return builder; } } 
} 

मैं नहीं बदल सकते जो बिल्डर एक उदाहरण पर दिखाई देता है, लेकिन मैं कर सकते हैं:

value.Builder.Append("hello"); 

यह आप kinds of immutability पर एरिक Lippert के ब्लॉग पोस्ट को पढ़ने के लायक हो सकता है - और वास्तव में श्रृंखला में बाकी सभी पदों।

+0

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

+0

आप संग्रह, अपरिवर्तनीय/परिवर्तनीय वर्ग जोड़े आदि के बारे में भी सोच सकते हैं। मैंने हाल ही में एक लेख लिखा था जो इस संदर्भ में दिलचस्प होना चाहिए: http://rickyhelgesson.wordpress.com/2012/07/17/mutable-or- अपरिवर्तनीय-में-समानांतर दुनिया/ –

4

हाँ, यह सही दिखता है।

ध्यान दें कि निजी सदस्यों को कक्षा के लिए अपरिवर्तनीय होने की आवश्यकता नहीं है, यह कक्षा के अंदर एक अतिरिक्त सावधानी बरतने वाला कोड है।

+0

टिप के लिए धन्यवाद – Hoody

संबंधित मुद्दे