संग्रह प्रारंभकर्ता अभिव्यक्तियों के इन दो भिन्नताओं के बीच क्या अंतर है?

Tagc 09/16/2017. 1 answers, 803 views
c# collection-initializer

मैं थोड़ी देर के लिए सी # का उपयोग कर रहा हूं, लेकिन हाल ही में देखा है कि मेरे यूनिट परीक्षणों में से एक का व्यवहार बदल गया है जिस पर मैंने संग्रह प्रारंभिक अभिव्यक्ति अभिव्यक्ति की विविधता के आधार पर उपयोग किया था:

  • var object = new Class { SomeCollection = new List { 1, 2, 3 } };
  • var object = new Class { SomeCollection = { 1, 2, 3 } };

इस बिंदु तक तक मैंने माना कि दूसरा रूप सिर्फ सिंटेक्टिक चीनी था और यह पहले रूप के बराबर था। हालांकि, इन दो रूपों के बीच स्विचिंग के परिणामस्वरूप मेरी असफल इकाई परीक्षण गुजर रही है।

नीचे दिया गया उदाहरण कोड यह दर्शाता है:

 void Main()
{
    var foo1 = new Foo { Items = new List { 1, 2, 3} };
    var foo2 = new Foo { Items = { 1, 2, 3 } };

    foo1.Dump();
    foo2.Dump();
}

class Foo
{
    public List Items { get; set; }
} 

जब मैं इसे चलाता हूं, तो पहला असाइनमेंट ठीक काम करता है लेकिन दूसरा परिणाम NullReferenceException

मेरी आंत महसूस यह है कि दृश्यों के पीछे संकलक इन दो अभिव्यक्तियों का इलाज कर रहा है:

 var foo1 = new Foo();
foo1.Items = new List { 1, 2, 3 }; 

var foo2 = new Foo();
foo2.Items.Add(1);
foo2.Items.Add(2);
foo2.Items.Add(3); 

क्या यह धारणा सटीक है?

1 Comments
Leon Barkan 07/31/2017
इससे आपकी मदद मिलेगी: c-sharpcorner.com/article/...

1 Answers


Jon Skeet 07/31/2017.

हां, आपकी धारणा सटीक है। यदि किसी ऑब्जेक्ट प्रारंभकर्ता के पास अभी है:

{
    Property = { ... }
} 

बजाय

{
    Property = expression
} 

तो संपत्ति के लिए getter का उपयोग नहीं किया जाता है - getter का उपयोग किया जाता है, और उसके बाद या तो Add विधि कहा जाता है, या गुण लौटाए गए मान के भीतर सेट होते हैं। इसलिए:

var foo = new Foo
{
    Collection = { 1 }
    Property =
    {
        Value = 1
    }
}; 

के बराबर है:

// Only the *getters* for Collection and Property are called
var foo = new Foo();
foo.Collection.Add(1);
foo.Property.Value = 1; 

इसके साथ तुलना करें:

var foo = new Foo
{
    Collection = new List { 1 },
    Property = new Bar { Value = 1 }
}; 

जो बराबर है:

// The setters for Collection and Property are called
var foo = new Foo();
foo.Collection = new List { 1 };
foo.Property = new Bar { Value = 1 }; 
1 comments
1 Ash Burlaczenko 07/31/2017
संग्रह के नए समकक्ष नहीं होना चाहिए या यह सिर्फ जोड़ता है?

Related questions

Hot questions

Language

Popular Tags