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
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.
Neden (gerçekten mi?) Liste<T> t...
Neden C# çok Boyutlu diziler uygulamak...
Neden't GCC*****a (**)*(**) optim...
Neden' ◎ܫ◎ ve fonksiyonu t JavaSc...
Neden boyutu(x ) x artım değil mi?...