Apakah perbezaan antara kedua-dua variasi ungkapan awal pengaturcaraan?

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

Saya telah menggunakan C # untuk seketika, tetapi baru-baru ini menyedari bahawa tingkah laku salah satu ujian unit saya berubah bergantung pada variasi pengekalan awal penapis yang saya gunakan:

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

Hingga ke tahap ini saya menganggap bahawa bentuk kedua hanyalah gula sintaksis dan bersamaan dengan bentuk pertama. Walau bagaimanapun, bertukar antara kedua-dua bentuk menyebabkan ujian unit gagal saya.

Kod contoh di bawah menunjukkan ini:

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

Apabila saya menjalankan tugas ini, tugasan pertama berfungsi dengan baik tetapi hasil kedua dalam NullReferenceException .

Perasaan saya adalah bahawa di belakang tabir pengkompil merawat kedua-dua ungkapan ini:

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

Adakah andaian itu tepat?

1 Comments
Leon Barkan 07/31/2017
Ini akan membantu anda: c-sharpcorner.com/article/...

1 Answers


Jon Skeet 07/31/2017.

Ya, andaian anda adalah tepat. Sekiranya pemasukan objek hanya mempunyai:

{
    Property = { ... }
} 

bukannya

{
    Property = expression
} 

maka setter untuk harta itu tidak digunakan - getter digunakan, dan kemudian sama ada kaedah Add dipanggil, atau sifat ditetapkan dalam nilai yang dikembalikan. Jadi:

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

bersamaan dengan:

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

Bandingkan dengan:

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

yang bersamaan dengan:

// 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
Sekiranya tidak sama dengan koleksi baru atau adakah ia hanya menambah?

Related questions

Hot questions

Language

Popular Tags