Ano ang pagkakaiba sa pagitan ng dalawang variation ng expression initialiser collection?

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

Ginagamit ko na ang C # sa isang sandali, ngunit kamakailan ay napansin na ang pag-uugali ng isa sa aking mga pagsusulit sa yunit ay nagbago depende sa kung anong variation ng initialiser expression na ginamit ko:

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

Hanggang sa puntong ito ay ipinapalagay ko na ang ikalawang form ay lamang syntactic asukal at semantically katumbas sa unang form. Gayunpaman, ang paglipat sa pagitan ng dalawang mga form na ito ay nagresulta sa paglipas ng pagtigil ng test unit.

Ang halimbawa ng code sa ibaba ay nagpapakita ito:

 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; }
} 

Kapag pinatakbo ko ito, ang unang assignment ay gumagana ng mabuti ngunit ang pangalawang resulta sa isang NullReferenceException .

Ang pakiramdam ko ay ang nasa likod ng mga eksena na tinatrato ng tagatala ang dalawang expression na ito:

 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); 

Tumpak ba ang palagay iyan?

1 Comments
Leon Barkan 07/31/2017
Makakatulong ka sa: c-sharpcorner.com/article / ...

1 Answers


Jon Skeet 07/31/2017.

Oo, tumpak ang iyong palagay. Kung mayroon lamang isang initializer ng bagay:

{
    Property = { ... }
} 

sa halip

{
    Property = expression
} 

pagkatapos ay hindi ginagamit ang setter para sa ari-arian - ginagamit ang getter , at pagkatapos ay alinman ang tinatawag na paraan ng Add , o mga katangian ay naka-set sa ibinalik na halaga. Kaya:

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

ay katumbas ng:

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

Ihambing ito sa:

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

na katumbas ng:

// 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
Hindi ba dapat ang katumbas sa bagong koleksyon o idagdag lang ba ito?

Related questions

Hot questions

Language

Popular Tags