SORU
10 Mayıs 2010, PAZARTESİ


Neden C't# değil endeksli özelliklerini uygulamak?

Biliyorum, bu tür bir soru için Eric Lippert cevabı genellikle bir şey gibi olduğunu biliyorum..."tasarlama, uygulama, Test ve belgeleme maliyet değer değildi çünkü".

Ama yine de, daha iyi bir açıklama istiyorum... this blog post about new C# 4 features, okuyordum ve COM birlikte çalışma hakkında bölümünde şu kısmı dikkatimi çekti :

Bu arada, bu kod bir tane daha yeni özellik kullanır: endeksli özellikleri (Dizi sonra o köşeli parantez daha yakından bir göz atın.)Ama bu özellik, COM birlikte çalışma için kullanılabilir; C kendi endeksli özellikleri# 4.0 oluşturamıyor.

TAMAM, ama neden ? Ben zaten biliyordum ve olası C endeksli özellikleri oluşturmak için değildi pişman oldum# ama bu cümle beni tekrar düşündürdü. Birkaç iyi sebep uygulamaya görebiliyorum :

  • CLR destekler (örneğin, PropertyInfo.GetValue index parametresi vardır), C bundan yararlanamıyoruz yazık yani#
  • makale (dynamic dispatch) kullanarak gösterildiği gibi COM birlikte çalışma için destekledi
  • VB.NET hayata
  • zaten mümkün oluşturmak için dizin oluşturucu, yani geçerli bir dizin için nesnenin kendisi, ki muhtemelen öyle abartılacak uzatmak fikri özellikleri, tutmak aynı sözdizimi ve değiştirilmesi this ile bir özellik adı

Bu tarz şeyler yazmak için izin vermesi :

public class Foo
{
    private string[] _values = new string[3];
    public string Values[int index]
    {
        get { return _values[index]; }
        set { _values[index] = value; }
    }
}

Şu anda tek geçici çözüm bu bildiğim oluşturmak için bir iç sınıf (ValuesCollection örneğin) uygulayan bir dizin oluşturucu ve değişim Values özellik döndürür, örneğin bu iç sınıf.

Bunu yapmak için çok kolay, ama can sıkıcı bir durum... bu Yüzden belki de derleyici bizim için bunu yapabilir ! Bir seçenek, dizin iç uygulayan bir sınıf oluşturmak için olabilir, ve ortak bir genel arabirim kullanır :

// interface defined in the namespace System
public interface IIndexer<TIndex, TValue>
{
    TValue this[TIndex index]  { get; set; }
}

public class Foo
{
    private string[] _values = new string[3];

    private class <>c__DisplayClass1 : IIndexer<int, string>
    {
        private Foo _foo;
        public <>c__DisplayClass1(Foo foo)
        {
            _foo = foo;
        }

        public string this[int index]
        {
            get { return _foo._values[index]; }
            set { _foo._values[index] = value; }
        }
    }

    private IIndexer<int, string> <>f__valuesIndexer;
    public IIndexer<int, string> Values
    {
        get
        {
            if (<>f__valuesIndexer == null)
                <>f__valuesIndexer = new <>c__DisplayClass1(this);
            return <>f__valuesIndexer;
        }
    }
}

Ama bu durumda tabii ki, özelliğiaslındadönüş 9* *ve gerçekten endeksli bir özelliği... daha iyi olurdu gerçek CLR endeksli bir özelliği oluşturmak için olmaz.

Ne düşünüyorsun ? C Bu özellik görmek ister misiniz# ? Değil, neden ?

CEVAP
10 Mayıs 2010, PAZARTESİ


C# 4 tasarladık.

İlk dil ekleme aklımıza gelen olası her özelliğini bir listesini yaptık.

O zaman biz bucketed özellikleri içine "bu kötü, biz gerekir asla yap", "bu harika, bu" ve "bu iyi ama duralım artık bu sefer".

Ne kadar tasarım, test, belge uygulamak zorunda kaldık baktık, gemi ve "lazım" özellikleri olduğunu keşfetti 100% üzerinde bir bütçe. bu dönülür

"Gitmem gerek," kova "kova." güzel " den bir sürü şey bu yüzden taşındık

Endeksli özelliklerini hiçbir yerdeyakınüst "" listesi. gerek yok "Listesi ve flört" kötü bir fikir "listesi." çok çok düşük

Her dakika geçiriyoruz tasarlama, uygulama, test, belgeleme ya da sürdürmek güzel özelliği X bir dakika edemeyiz harcamak harika özellikleri A, B, C, D, E, F ve G. olduğumuz için acımasızca öncelik, böylece biz sadece mümkün olan en iyi özellikleri. Endeksli özellikleri güzel olurdu, ama güzel bir yerde fiilen uygulanan almak için yeterince yakın bile değil.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Nesson

    Charles Ness

    27 NİSAN 2006
  • Ionized Digital Air Studios

    Ionized Digi

    20 HAZİRAN 2009
  • FND Films

    FND Films

    2 Mayıs 2006