2012-10-11 12 views
49

क्या सी # ऑब्जेक्ट प्रारंभकर्ताओं का उपयोग करने में कोई लाभ है?क्या ऑब्जेक्ट इनिशिलाइज़र का उपयोग करने का कोई फायदा है?

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

सी # में उनके उपयोग के लिए क्या मामला है?

How to: Initialize Objects by Using an Object Initializer (C# Programming Guide)

+3

कुछ कीस्ट्रोक को बचाने के लिए यह वाक्य रचनात्मक चीनी है और एक निष्पादन योग्य कथन (इनलाइन लिनक कॉल जैसी सामग्री के लिए) पर कोड प्राप्त करें। शैली को अज्ञात प्रकार के निर्माण के लिए भी उधार लिया जाता है: 'नया {फर्स्टनाम = "एडम", आयु = 27}; ' –

+0

कृपया, प्रश्न शीर्षक में उपयोग की जाने वाली किसी भाषा के बारे में जानकारी शामिल न करें जब तक कि इसके बिना इसका अर्थ न हो। टैग इस उद्देश्य की सेवा करते हैं। –

+0

आपने 18 महीने का प्रश्न संपादित किया –

उत्तर

13

लाभ सिर्फ मापदंडों

+0

+1 यह हर जगह नए MyType() {....} लिखने के बजाय, ऐसे पैरामीटर के लिए निहित टाइपिंग की अनुमति देता है। – cirrus

+3

आप अपने कन्स्ट्रक्टर में नामित और वैकल्पिक पैरामीटर का उपयोग कर कन्स्ट्रक्टर की अनावश्यक ओवरलोडिंग भी प्राप्त कर सकते हैं: http://msdn.microsoft.com/en-us/library/dd264739.aspx –

89

एक अक्सर याद लाभ atomicity है पारित करने के लिए गुमनाम वस्तुओं, LINQ प्रश्नों, निर्माताओं की कभी कभी अनावश्यक रूप से अधिक भार का उपयोग कर रहे हैं। यह उपयोगी है यदि आप किसी ऑब्जेक्ट पर double-checked locking का उपयोग कर रहे हैं। ऑब्जेक्ट स्टार्टिज़र नई ऑब्जेक्ट देता है जब उसने आपके द्वारा बताए गए सभी सदस्यों को प्रारंभ किया है। MSDN लेख पर उदाहरण से:

StudentName _tempStudent = new StudentName(); 
_tempStudent.FirstName = "Craig"; 
_tempStudent.LastName = "Playstead"; 
_tempStudent.ID = 116; 

StudentName student = _tempStudent; 

यह सुनिश्चित करता है कि student आंशिक रूप से प्रारंभ कभी नहीं किया गया है:

StudentName student = new StudentName 
{ 
    FirstName = "Craig", 
    LastName = "Playstead", 
    ID = 116 
}; 

निम्नलिखित की तरह कुछ करने के लिए अनुवाद किया जा चाहेंगे। यह या तो null होगा या पूरी तरह से प्रारंभ किया जाएगा, जो बहु-थ्रेडेड परिदृश्यों में उपयोगी है।

इस पर अधिक जानकारी के लिए, आप this आलेख देख सकते हैं।

एक अन्य लाभ यह है कि यह आपको अनाम वस्तुओं को बनाने की अनुमति देता है (उदाहरण के लिए, प्रक्षेपण बनाने या LINQ में एकाधिक कुंजियों में शामिल होने के लिए)।

+3

'फर्स्टनाम' पर परमाणुता संरक्षित नहीं होगी ', 'LastName' और' ID' को' StudentName 'के निर्माता के अंदर प्रारंभ किया गया था? – Songo

+2

हां, यह होगा। परमाणुता के बारे में उपरोक्त बयान तब होता है जब आपको कन्स्ट्रक्टर के बाहर अपनी वस्तु के गुणों को प्रारंभ करने की आवश्यकता होती है। इसके कुछ उदाहरण ऐसे मामले हैं जहां आप कन्स्ट्रक्टर कोड नहीं बदल सकते हैं, या जहां आपकी ऑब्जेक्ट में बड़ी संख्या में वैकल्पिक गुण हैं जिन्हें आप दर्जनों अधिभारित कन्स्ट्रक्टर बनाने के बिना सेट करना चाहते हैं। –

1

मुझे लगता है कि यह पठनीयता को बढ़ावा देता है।

एक साइड नोट के रूप में, दिखाए गए लिंक में दिए गए उदाहरण में, मैं कभी-कभी गुणों (फर्स्टनाम और लास्टनाम) के लिए एक निजी सेटटर रखना पसंद करता हूं, लेकिन यह आपके डिज़ाइन पर निर्भर करता है।

+2

आपका उत्तर थोड़ा उलझन में है। ऐसा लगता है कि आप रीडोनली प्रॉपर्टी के समान कार्यक्षमता बनाने के लिए निजी सेटर्स और ऑब्जेक्ट इंटियालाइज़र सिंटैक्स का उपयोग करने का सुझाव दे रहे हैं। यदि आप अपने सेटर्स को निजी बनाते हैं, तो उन्हें ऑब्जेक्ट प्रारंभकर्ता सिंटैक्स के साथ उपयोग नहीं किया जा सकता है जब तक कि आप इसे किसी ऐसे स्थान पर उपयोग नहीं कर रहे हैं जिसके पास पहले से ही उन निजी सेटर्स तक पहुंच हो। –

+0

मैं सहमत हूं। मुझे इसे बेहतर तरीके से कहना चाहिए था। ओपी का जवाब देने के लिए, मैं वास्तव में केवल इतना कह रहा हूं कि मुझे लगता है कि यह पठनीयता को बढ़ावा देता है। मैंने जो लिखा है उसका शेष थोड़ा सा विषय है। मैंने इसे प्रतिबिंबित करने के लिए पाठ संपादित किया है। – Kirby

21

नहीं उपयोग वस्तु initializers के लिए एक संभावित कारण है: यदि आरंभीकरण के दौरान एक अपवाद है, विजुअल स्टूडियो डीबगर में कॉल स्टैक केवल प्रारंभकर्ता अभिव्यक्ति और कोई विशिष्ट लाइन जहां अपवाद घटित वापस आ जाएगी।

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

उदाहरण: कल्पना करें कि यह आपका कोड है, लेकिन आप बाहरी सेवा के स्रोत को नहीं पढ़ सकते हैं क्योंकि यह आपके आवेदन के बाहर है। आपको नहीं पता होगा कि यह "चार्ली" पैरामीटर था जिसने बाहरी सेवा में त्रुटि उत्पन्न की थी।

var instance = new ClassToBeInitialized 
    { 
     alpha = "alpha", 
     bravo = ExternalService(0), 
     charlie = ExternalService(1) 
    }; 

    private static string ExternalService(int parameter) 
    { 
     if (parameter == 1) 
     { 
      throw new Exception("The external service crashed"); 
     } 

     return "correctStringResult"; 
    } 
+5

मैं इस पोस्ट में बिल्कुल यह जांचने के लिए समाप्त हुआ कि कोई भी इसका दावा करता है या नहीं। पिछले हफ्तों में मेरी टीम में इस पर बहस हो रही है। मैं एक डेवलपर के रूप में सिंटैक्स चीनी की तरह करता हूं जो इसे प्रदान करता है (ऊपर दिए गए अन्य लाभ मेरे संदर्भ के लिए प्रासंगिक नहीं हैं) - लेकिन मैं इसे एक कारण के रूप में स्वीकार कर सकता हूं जो इसे उपयोग न करने के लिए पर्याप्त है (ऐसे मामलों में जहां मेरा लाभ नहीं है इसका उपयोग करने में किसी और चीज से)। – Veverke

0

वस्तु प्रारंभ के 3 मुख्य लाभ कीस्ट्रोक्स के

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

  • पढ़ने योग्य और रखरखाव करने में आसान।

  • समय बचाने का दृष्टिकोण।

दें यहाँ देखें कि यह कैसे कीस्ट्रोक्स के बहुत से बच सकते हैं:

# 3,0 ग इससे पहले कि हम इस-

  public class Employee 
     { 
      public string Name { get; set; } 
      public int Id { get; set; } 
      public string Department { get; set; } 
      public int salary { get; set; } 
     } 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       Employee emp=new Employee(); 
       emp.Name = "Kumar"; 
       emp.Department = "IT"; 
       emp.Id = 101; 
       emp.salary = 80000; 
       Console.ReadLine(); 

      } 
     } 

की तरह प्रारंभ कर रहे थे अब के बाद सी # 3.0 हम एक पंक्ति के रूप में में प्रारंभ हो जाएगा इस प्रकार है।

class Program 
    { 
     static void Main(string[] args) 
     { 
      Employee emp = new Employee {Name = "Kisan",Id = 55,Department = "IT",salary = 20000};   

     } 
    }