2010-03-12 12 views
26

कक्षा ए सदस्य को पैरामीटर मूल्य पर सेट करने के लिए प्रारंभकर्ता सूची का उपयोग करता है, जबकि कक्षा बी कन्स्ट्रक्टर के शरीर के भीतर असाइनमेंट का उपयोग करता है।सी # कन्स्ट्रक्टर में प्रारंभ करते समय बेहतर क्या होता है: प्रारंभकर्ता सूचियां या असाइनमेंट?

क्या कोई भी एक दूसरे को एक से अधिक पसंद करने का कोई कारण दे सकता है जब तक कि मैं लगातार हूं?

class A 
{ 
    String _filename; 

    A(String filename) : _filename(filename) 
    { 
    } 
} 


class B 
{ 
    String _filename; 

    B(String filename) 
    { 
     _filename = filename; 
    } 
} 

उत्तर

67

पहले एक सी # में कानूनी नहीं है। एक निर्माता में कोलन के बाद दिखाई देने वाली केवल दो आइटम base और this हैं।

तो मैं दूसरे के साथ जाऊंगा।

+9

धन्यवाद, सी ++ से आ रहा है, मैं सोच रहा था कि सिंटेक्स ए (सदस्य प्रारंभिक सूची) सी # के लिए व्यवहार्य था या नहीं। –

15

क्या आपका मतलब सी #+ के बजाय सी ++ था?

  • पॉड प्रकार (int, नाव, आदि ..) के लिए, अनुकूलक अक्सर पर्दे के पीछे एक अधिक कुशल memcpy कर सकते हैं:

    सी ++ के लिए, प्रारंभकर्ता सूचियों के कारणों की एक जोड़ी के लिए काम की तुलना में बेहतर कर रहे हैं जब आप डेटा के लिए प्रारंभकर्ता प्रदान करते हैं।

  • गैर-पीओडी प्रकारों (वस्तुओं) के लिए, आप केवल एक निर्माण करके दक्षता प्राप्त करते हैं। कन्स्ट्रक्टर में असाइनमेंट के साथ, कंपाइलर को पहले अपनी ऑब्जेक्ट बनाना चाहिए, फिर इसे एक अलग चरण में असाइन करें (यह पीओडी प्रकारों पर भी लागू होता है)।
0

सी # में Object Initializer नामक एक सुविधा है। आप उन मानों को प्रदान कर सकते हैं जो संकलक निर्दिष्ट सदस्यों को प्रारंभ करने के लिए उपयोग करेंगे, और डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करेंगे। इसके लिए काम करने के लिए आपको एक सार्वजनिक डिफ़ॉल्ट कन्स्ट्रक्टर होना चाहिए।