2009-08-17 27 views
11

इस स्निपेट में:सी #: क्या यह फ़ील्ड असाइनमेंट सुरक्षित है?

class ClassWithConstants 
{ 
    private const string ConstantA = "Something"; 
    private const string ConstantB = ConstantA + "Else"; 

    ... 

} 

वहाँ ConstantB == "Else" साथ समाप्त होने का खतरा है? या आकलन रैखिक रूप से होता है?

+0

@Svish, कृपया अपने जवाब –

+0

@Nathan पर जॉन स्कीट की टिप्पणी देखते हैं, धन्यवाद, इस पर ध्यान नहीं दिया था: पी – Svish

उत्तर

37

आप कभी भी "SomethingElse" मिल जाएगा। ऐसा इसलिए है क्योंकि कॉन्स्टेंटबी कॉन्स्टेंट ए पर निर्भर करता है।

आप लाइनों को भी स्विच कर सकते हैं और आपको एक ही परिणाम मिल जाएगा। संकलक जानता है कि कॉन्स्टेंटबी कॉन्स्टेंट ए पर निर्भर करता है और इसे तदनुसार संभाल लेगा, भले ही आप इसे आंशिक कक्षाओं में लिखें।

पूरी तरह से सुनिश्चित करने के लिए कि आप वीएस कमांड प्रॉम्प्ट चला सकते हैं और ILDASM को कॉल कर सकते हैं। वहां आप वास्तविक संकलित कोड देख सकते हैं।

ही, यदि आप निम्नलिखित आप एक संकलन त्रुटि मिलेगी करने की कोशिश:

private const string ConstantB = ConstantA + "Else"; 
private const string ConstantA = "Something" + ConstantB; 

त्रुटि: 'ConsoleApplication2.Program.ConstantB' के लिए निरंतर मूल्य के मूल्यांकन एक परिपत्र परिभाषा शामिल है इस प्रकार का यह साबित करता है कि संकलक इसकी निर्भरताओं को जानता है।


जोड़ा गया: युक्ति संदर्भ Jon Skeet द्वारा ने कहा:

This is explicitly mentioned in section 10.4 of the C# 3 spec: Constants are permitted to depend on other constants within the same program as long as the dependencies are not of a circular nature. The compiler automatically arranges to evaluate the constant declarations in the appropriate order.


+2

हाँ, आप ठीक है - दोह! :) spec में बिट खोजने की कोशिश कर रहा है जो इसकी गारंटी देता है ... –

+0

अब इसे मिला - धारा 10.4। –

+3

मेरा जवाब संपादित किया गया है, इसलिए कम से कम यह लोगों को गुमराह करने वाला नहीं है, लेकिन अगर मैं कर सकता हूं तो इसे हटा दूंगा। –

3

यह स्ट्रिंग concatenation संकलन समय पर होता है क्योंकि केवल स्ट्रिंग अक्षर हैं (के लिए खोज संकलक निर्माण साहित्य में निरंतर फोल्डिंग)।

इसके बारे में चिंता न करें।

2

यह हमेशा का मूल्यांकन करना चाहिए करने के लिए "SomethingElse"

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