2013-02-22 46 views
7

जावा में, final का मतलब है कि एक चर केवल एक बार असाइन किया जा सकता है, लेकिन यह असाइनमेंट प्रोग्राम में कहीं भी हो सकता है। सी #, readonly का अर्थ है कि एक फ़ील्ड केवल कन्स्ट्रक्टर में असाइन किया जा सकता है, जो आईएमओ काफी कम उपयोगी है।सी # रीडोनली बनाम जावा फाइनल

जैसा कि हम सभी जानते हैं, सी # जावा डिजाइन से काफी प्रभावित था, लेकिन इस अंतर ने मुझे हमेशा अजीब होने के कारण परेशान किया है। क्या किसी को पता है कि सीएलआर में तकनीकी कारण है जिसके परिणामस्वरूप सी #बनाम जावा के final के कम उपयोगी व्यवहार के परिणामस्वरूप?

संपादित करें:

टिप्पणियों के जवाब में; मैं यह इंगित करना चाहता हूं कि मैं अपरिवर्तनीयता के लाभों से अच्छी तरह से अवगत हूं, और मैं इसे पूरे स्थान पर उपयोग करता हूं। मेरा मानना ​​है कि readonly कम जावा के अलावा वजह से उपयोगी है:

public class Foo 
{ 
    private readonly int _bar; 

    Foo() 
    { 
     _bar = 5; 
    } 
} 

ओह, मैं वास्तव में एक सहायक विधि में वह मान प्रारंभ करने की जरूरत है!

public class Foo 
{ 
    private readonly int _bar; 

    Foo() 
    { 
     initialize() 
    } 

    private void initialize() 
    { 
     _bar = 5; //Can't compile because of semantics of readonly 
    }  
} 
+25

आपका "कम उपयोगी" मेरा "अधिक सुरक्षित" है। – Oded

+2

अपरिवर्तनीयता के क्या फायदे हैं? मुझे लगता है कि आपको 'readonly' मिल जाएगा संकलक के लिए काफी उपयोगी हो सकता है। आप सवाल स्वाभाविक रूप से व्यक्तिपरक है। – Jodrell

+2

आप जावा में कार्यक्रम में कहीं भी अंतिम चरम पर मूल्य का आकलन नहीं कर सकते हैं। यदि आप स्थिर अंतिम स्थिर बना रहे हैं तो आपको स्पॉट पर मूल्य देना होगा अन्यथा यदि आप चर के रूप में चर बना रहे हैं तो आप इसे कन्स्ट्रक्टर में शुरू कर सकते हैं। – ankurtr

उत्तर

12

वहाँ है readonly के व्यवहार के लिए एक तकनीकी कारण: बनाया विधानसभा के मेटाडेटा में क्षेत्र initonly विशेषता है कि क्षेत्र सुनिश्चित करेगा एक निर्माता के बाहर संशोधित नहीं है के साथ चिह्नित है। हालांकि, अविश्वसनीय रूप से, पाठक क्षेत्र का पता ले कर, अभी भी अपना मूल्य बदलना संभव है। सत्यापन योग्य आईएल और सी # आपको ऐसा करने की अनुमति नहीं देगा।

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

मेरी राय में यह readonly कीवर्ड को कम कीमत नहीं बनाता है। मैं इसे उन जगहों के लिए उपयोग करता हूं जिनके मूल्य केवल निर्माता (जैसे एक सूची बनाना, या एक कन्स्ट्रक्टर तर्क संग्रहीत करना) द्वारा प्रदान किया जाता है। सी # यह सुनिश्चित करेगा कि मैं उस क्षेत्र को फिर से नहीं बदलूंगा, यह सुनिश्चित कर रहा हूं कि मैं इसे null या कुछ भी सेट नहीं कर सकता।

) इस बिंदु को इंगित करने के लिए एरिक लिपर्ट के लिए धन्यवाद।

+0

@EricLippert: इसे इंगित करने के लिए धन्यवाद। मैं हर दिन कुछ नया सीखता हूं ... – Virtlink

+0

आपका स्वागत है! –

+0

@Virtlink आपके उत्तर के लिए धन्यवाद। यह अच्छा है कि हर कोई सिर्फ चीज़ों को बंद करने के बहाने नहीं देखता है। – MgSam