Toplama başlatıcı ifadelerinin bu iki varyasyonu arasındaki fark nedir?

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

Bir süredir C # kullanıyorum ama son zamanlarda kullandığım koleksiyon başlatıcı ifadesinin hangi varyasyonuna bağlı olarak benim birim testlerimin davranışının değiştiğini fark ettim:

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

Bu noktaya kadar, ikinci formun sadece sözdizimsel şeker olduğunu ve semantik olarak birinci forma eşdeğer olduğunu varsaydım. Bununla birlikte, bu iki form arasında geçiş yapmak, başarısız birim testinin yapılmasına neden oldu.

Aşağıdaki örnek kod şunu göstermektedir:

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

Bunu çalıştırdığımda, ilk ödev iyi çalışır, ancak ikinci bir NullReferenceException sonuçlanır.

Benim bağırsak duygularım, sahnelerin arkasında derleyicinin bu iki ifadeyi şu şekilde ele almasıdır:

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

Bu varsayım doğru mu?

1 Comments
Leon Barkan 07/31/2017
Bu size yardımcı olacak: c-sharpcorner.com/article/…

1 Answers


Jon Skeet 07/31/2017.

Evet, senin varsayımın doğru. Bir nesne başlatıcısı sadece varsa:

{
    Property = { ... }
} 

ziyade

{
    Property = expression
} 

daha sonra özellik için setter kullanılmaz - getter kullanılır ve sonra Add yöntemi çağrılır veya özellikler döndürülen değer içinde ayarlanır. Yani:

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

eşdeğerdir:

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

Bunu şununla karşılaştırın:

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

buna eşdeğerdir:

// 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
Yeni koleksiyona da eşdeğer değil mi, yoksa ekliyor mu?

Related questions

Hot questions

Language

Popular Tags