9

निम्नलिखित उदाहरण को देखते हुए, एक दूसरे से बेहतर/तेज/सुरक्षित है? क्या शाब्दिक तत्कालता का उद्देश्य सबसे अच्छा अभ्यास होना चाहिए जहां यह व्यावहारिक है?ऑब्जेक्ट लिटलल इंस्टेंटेशन गुणों को सेट करने से तेज़ है?

यह अनुचित कहां है?

class Person 
{ 
    public string name; 
    public int age; 
} 
void MakePeople() 
{ 
    Person myPerson = new Person(); 
    myPerson.name = "Steve"; 
    myPerson.age = 21; 

    Person literalPerson = new Person { name = "John", age = 22 }; 
} 
+3

उन दो तरीकों से उत्पन्न आईएलएल समान होना चाहिए। तो, नहीं। –

+2

इरादे और प्रभाव के बारे में तीन और स्पष्ट के बजाय एक पंक्ति। यह 10 गुना धीमा हो सकता है और यह अभी भी एक अच्छा विचार होगा। मैं छोटे प्रदर्शन मतभेदों पर लोगों के निर्धारण को समझ नहीं सकता (एक डिफ़ॉल्ट दृष्टिकोण के रूप में; मुझे हॉटस्पॉट हॉट-ऑप्टिमाइज़ करने में खुशी है)। – delnan

उत्तर

16

नहीं, यह तेज़ या धीमा नहीं है। यह समान हे।

कंपाइलर ऑब्जेक्ट प्रारंभकर्ताओं को एक कन्स्ट्रक्टर कॉल में उन गुणों को सेट करके अनुवाद करता है।

Person literalPerson = new Person { name = "John", age = 22 }; 

में बदल जाता है:

Person myPerson = new Person(); 
myPerson.name = "John"; 
myPerson.age = 22; 

आप का उपयोग करना चाहिए क्या अधिक पठनीय है और क्या आप अपनी टीम के साथ पर सहमत हुए हैं।

+2

+1 और अधिक पठनीय (टीम पर्यावरण के लिए esp।) का उपयोग करने के लिए +1 – JYelton

+5

तकनीकी रूप से यह बिल्कुल वैसा ही नहीं है क्योंकि संकलक आपके परिवर्तनीय परमाणु को असाइनमेंट रखने के लिए अस्थायी चर घोषित करता है। –

+0

@ किर्कवॉल क्या यह उपर्युक्त मामले में भी सच है जहां 'व्यक्ति' संदर्भ प्रकार है? –

0

यदि आप जेनरेट किए गए आईएल को देखते हैं, तो मुझे पूरा यकीन है कि आप पाएंगे कि वे समान हैं। ऑब्जेक्ट प्रारंभकर्ता का उपयोग करना केवल एक कंपाइलर शॉर्टकट है।

1

या तो उपयुक्त है। यह गुणों को सेट करने के लिए आपको क्या करने की आवश्यकता है इस पर निर्भर करता है। उदाहरण के लिए, मैं मामलों में शाब्दिक इन्स्टेन्शियशन से बच जाएंगे जहां कुछ तर्क एक संपत्ति के मूल्य पर पहुंचने के लिए की जरूरत है:

Person myPerson = new Person(); 
myPerson.SomeProperty = if IsNewPerson ? GetPropertyFromDatabase() : GetDefaultProperty(); 

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

एक लाभ यह दृश्य स्टूडियो में शाब्दिक वस्तु प्रारंभ का उपयोग करने कि है Intellisense गुणों के लिए संकेत देंगे, केवल वे दिखाएंगे जिन्हें पहले ही घोषित नहीं किया गया है। (मैंने कोड में भाग लिया है जहां गुणों को सेट करते समय एक मूल्य को अनावश्यक रूप से असाइन किया गया था।)

+1

हालांकि यह सिर्फ व्यक्तिगत वरीयता है। आप अभी भी शाब्दिक प्रारंभिकरण का उपयोग कर ऐसा कर सकते हैं। – Servy

+0

आप कर सकते हैं लेकिन यह बहुत कम पठनीय हो जाता है। – JYelton

+0

और पठनीयता वरीयता का मामला है। मेरा मुद्दा यह नहीं है कि यह बुरा है, केवल जेनरेट कोड अभी भी वही है, यहां तक ​​कि आपके उदाहरण में भी। – Servy

0

मुझे नहीं लगता कि गति इस निर्णय को क्या चलाना चाहिए। किसी भी विधि की गति के बीच शायद बहुत कम अंतर है।

मुझे लगता है कि कोड पठनीयता आपको किस तरह से प्रमुख कारक होना चाहिए। उस मानदंड का उपयोग करके, मुझे लगता है कि वे बहुत करीब हैं और यह व्यक्तिगत वरीयता या आपकी टीम द्वारा तय किए जाने वाले कुछ भी नीचे आती है। हालांकि, मुझे लगता है कि किसी ऑब्जेक्ट के मामले में कई गुणों को सेट करने की आवश्यकता है, स्पष्ट रूप से सेटर्स को कॉल करना थोड़ा और पठनीय है।