SORU
19 Ocak 2009, PAZARTESİ


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
20 Ocak 2009, Salı


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

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Elliot Davin

    Elliot Davin

    28 Kasım 2008
  • girleffect

    girleffect

    20 Mayıs 2008
  • Jared Busch

    Jared Busch

    25 Mayıs 2011