SORU
18 Kasım 2008, Salı


C# üye değişken başlatma; en iyi yöntem?

Beyanname üzerinde başlatmak sınıf üyesi değişkenleri için daha iyi olur

private List<Thing> _things = new List<Thing>();
private int _arb = 99;

veya varsayılan kurucu?

private List<Thing> _things;
private int _arb;

public TheClass()
{
  _things = new List<Thing>();
  _arb = 99;
}

Sadece tarz meselesi mi yoksa performans için bir denge, öyle ya da böyle var mı?

CEVAP
18 Kasım 2008, Salı


Performans açısından, gerçek bir fark yoktur; alan başlatıcılar yapıcı mantık olarak uygulanır. Tek fark alan başlatıcılar herhangi bir ""bu" yapıcı."/base daha önce de oldu bu.

Yapıcı yaklaşım otomatik uygulanan özellikler (alan başlatıcılar olamaz)-yani kullanılabilir

[DefaultValue("")]
public string Foo {get;set;}
public Bar() { // ctor
  Foo = "";
}

Bunun dışında, alan başlatıcı sözdizimi tercih ederim; şeyler yerelleştirilmiş tutar buluyorum yani

private readonly List<SomeClass> items = new List<SomeClass>();
public List<SomeClass> Items {get {return items;}}

Avcılık yukarı ve aşağı atanmış nerede olduğunu bulmak için gitmek zorunda değilsiniz...

Açık istisna karmaşık mantık yerine ya da bu durumda yapıcı tabanlı başlatma gitmek yoludur yapıcı parametreleri ile başa çıkmak için gereken yere. Eğer birden fazla kurucular varsa, benzer şekilde, alanlardan her zaman az gibi olabilir yani aynı şekilde set almak için tercih olacaktır:

public Bar() : this("") {}
public Bar(string foo) {Foo = foo;}

edit: bir yan yorum, unutmayın yukarıda, varsa diğer alanlar (gösterilmez) ile alan başlatıcılar, o zaman onlar sadece doğrudan başlatılmış kurucular bu Ara base(...) - yani public Bar(string foo) decimal. Diğer kurucu yokdeğilthis(...) decimal tarafından yapılır bunu bildiği için başlatıcılar alan.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • LivestrongWoman

    LivestrongWo

    1 Aralık 2011
  • RiceBunny

    RiceBunny

    16 ŞUBAT 2006
  • undrmyumbrellaa

    undrmyumbrel

    25 Temmuz 2012