2010-01-07 26 views
29

मैं # 3 सी प्रारंभकर्ता वाक्य रचना की तरह है और यह बहुत अधिक उपयोग करते हैं, लेकिन आज जबकि परावर्तक में देख, निम्नलिखित आया:प्रारंभकर्ता वाक्य रचना

var binding = new WSHttpBinding 
{ 
    ReaderQuotas = { MaxArrayLength = 100000 }, 
    MaxReceivedMessageSize = 10485760 
}; 

पहले तो मैंने सोचा कि यह एक गलती थी, लेकिन यह संकलित करता है ! मान लीजिए कि मैं अभी भी हर समय नई चीजें सीख रहा हूं। :)

जो मैं कह सकता हूं उससे, यह WSHttpBinding की ReaderQuotas संपत्ति की MaxArrayLength संपत्ति सेट करता है।

क्या यह वाक्यविन्यास एक नया ReaderQuotas ऑब्जेक्ट बनाता है और फिर संपत्ति सेट करता है, या क्या यह प्रॉपर्टी को पहले से शुरू करने के लिए मानता है? क्या यह सामान्य तरीका है कि कोई 'बच्चे' गुणों को शुरू करने के लिए उपयोग करेगा?

मैं वाक्य रचना थोड़ा संशय है कर ...

+0

आपको [इस पोस्ट] में दिलचस्पी हो सकती है (http: //www.codeducky।संगठन/यहां तक ​​कि संक्षेप-सी-ऑब्जेक्ट-प्रारंभकर्ता /), जो इस प्रकार के प्रारंभिक – ChaseMedallion

उत्तर

22

नहीं, यह नई वस्तुओं का निर्माण नहीं करता जब तक कि आप = new SomeType {...} का उपयोग करें:

var binding = new WSHttpBinding 
{ 
    ReaderQuotas = new XmlDictionaryReaderQuotas { MaxArrayLength = 100000 }, 
    MaxReceivedMessageSize = 10485760 
}; 

आपका उदाहरण के गुणों की स्थापना के लिए प्रारंभकर्ता वाक्य रचना से पता चलता मौजूदा उप-वस्तुओं। संग्रह पर "जोड़ें" विधियों को कॉल करने के लिए एक समान वाक्यविन्यास भी है।

var binding = new WSHttpBinding(); 
binding.ReaderQuotas.MaxArrayLength = 100000; 
binding.MaxReceivedMessageSize = 10485760; 
+0

के लिए अर्थशास्त्र और उपयोग-मामलों पर चर्चा करता है, उसके समान दिखता है, क्या केवल एक वाक्य रचनात्मक अंतर से कहीं अधिक है? ऐसा लगता है (जब तक ReaderQuotas WSHttp बाइंडिंग के निर्माता में प्रारंभ नहीं किया जाता है) इसे – James

+0

अपवाद फेंकना चाहिए धन्यवाद, यह मुझे आश्चर्य से ले गया :) मुझे लगता है कि आप 'एड' का मतलब संग्रह संग्रहकर्ता की तरह मानते हैं? – leppie

+0

@james: मैं उस मामले में अपवाद की अपेक्षा करता हूं, लेकिन स्रोत कोड नहीं होने से भ्रमित साबित हो सकता है, अगर आप नहीं जानते कि कन्स्ट्रक्टर में क्या किया जाता है। कुछ कन्स्ट्रक्टर अधिभार उस संपत्ति को प्रारंभ या नहीं कर सकते हैं, जिससे और भी भ्रम पैदा हो सकता है। – leppie

14

यह थोड़ा भ्रामक है, मैं मानता हूँ:

आपका कोड मोटे तौर पर के बराबर है।

आपको के खंड 7.6.10.2 को विनिर्देशन पढ़ना चाहिए; यह सब समझाया गया है। उदाहरण के लिए:

एक सदस्य प्रारंभकर्ता कि एक अभिव्यक्ति निर्दिष्ट करता है के बाद बराबर चिह्न क्षेत्र या संपत्ति को काम के रूप में एक ही तरह से संसाधित किया जाता है।

एक सदस्य प्रारंभकर्ता कि बराबरी के बाद एक ऑब्जेक्ट प्रारंभकर्ता निर्दिष्ट करता संकेत एक नेस्टेड ऑब्जेक्ट प्रारंभकर्ता, अर्थात एक एम्बेडेड वस्तु का एक प्रारंभ है। क्षेत्र या संपत्ति के लिए नया मान निर्दिष्ट करने के बजाय, नेस्टेड ऑब्जेक्ट प्रारंभकर्ता में असाइनमेंट को क्षेत्र या संपत्ति के सदस्यों को असाइनमेंट के रूप में माना जाता है। नेस्टेड ऑब्जेक्ट प्रारंभकर्ता मान प्रकार वाले गुणों पर लागू नहीं हो सकते हैं, या केवल मान प्रकार के साथ केवल पढ़ने के लिए फ़ील्ड पर लागू हो सकते हैं।

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

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