Neden C# koleksiyon başlatıcılar bu şekilde çalışır mı?
C bakıyordum# koleksiyon başlatıcı ve C başka bir şey aksine çok pragmatik olmak uygulama buldum ama aynı zamanda çok#
Bu gibi bir kod oluşturmak mümkün duyuyorum
using System;
using System.Collections;
class Program
{
static void Main()
{
Test test = new Test { 1, 2, 3 };
}
}
class Test : IEnumerable
{
public IEnumerator GetEnumerator()
{
throw new NotImplementedException();
}
public void Add(int i) { }
}
Derleyici (IEnumerable
public void Add
uygulanan) gereksinimlerini tatmin beri bu çalışıyor ama belli ki hiçbir değeri yoktur.
C engelleyen ne merak ettim# gereksinimlerinin daha katı bir takım oluşturma takım? Başka bir deyişle neden bu sözdizimi için derlemek için derleyici gerektirir türü ICollection
uygulamıyor? Diğer C ruhu gibi# özellikleri.
CEVAP
Gözlem - aslında, bir Mads tarafından yapılmış aynalar Torgersen nokta, Microsoft C# Dili PM.
Mads bu konu başlıklı Ekim 2006'da bir mesaj yaptıWhat Is a Collection?o yazdığı:
Kabul, ilk olarak elimize yüzümüze bulaştırdık ile çerçeve sürümü Sistem.Koleksiyonları.Icollection, işe yaramaz yanında. Ama biz sabit oldukça iyi zaman jenerik geldi .NET 2.0 çerçeve: Sistem.Koleksiyonları.Jenerik.Icollection<T> Ekleme ve öğeleri Kaldırmak sağlar onları sıralamak, onları Saymak ve kontrol üyelik için.
Belli ki o günden sonra herkes olur uygulamak ICollection<T> her zaman onlar bir koleksiyon yapmak, değil mi? Çok değil. Burada ETMENİZ öğrenmek için kullanılır gerçekten ne hakkında, nasıl bizim dilimizi değişiklik yaptı C tasarım# 3.0.
Bu çerçevede ICollection<T>
sadece 14 uygulamaları, ama IEnumerable
uygulamak ve Add()
genel bir yöntem olan 189 sınıf var çıkıyor.
Bu yaklaşım gizli bir avantajı var - ICollection<T>
arabirim dayalı olsaydı, tam bir Add()
desteklenen bir yöntem olurdu.
Buna karşılık, aldılar yaklaşım koleksiyon başlatıcılar sadece Add()
yöntem için bağımsız değişken kümeleri formu anlamına gelir.
Göstermek için, senin kod biraz uzatın
class Test : IEnumerable
{
public IEnumerator GetEnumerator()
{
throw new NotImplementedException();
}
public void Add(int i) { }
public void Add(int i, string s) { }
}
Şimdi bu yazabilirsiniz:
class Program
{
static void Main()
{
Test test
= new Test
{
1,
{ 2, "two" },
3
};
}
}
Neden Javascript sadece IE Geliştirici...
Neden CSS sahte öğeleri ile çalışır?...
Daha önce bir şey yineleme zaman bu ko...
Neden tüm Raylar yardımcıları tüm görü...
Neden olduğunu GÖRDÜM bu şekilde tasar...