Neden Listesi< devralır;T>?
Benim program yapmayı düşünürseniz, ben sık sık böyle bir düşünce zinciri ile başlar:
Bir futbol takımı futbolcuları listesi. Bu nedenle, onu temsil etmek zorundayım
var football_team = new List<FootballPlayer>();
Bu liste sıralaması hangi oyuncu kadrosu listelenmiştir sipariş temsil eder.
Ama takım da kaydedilmiş olması gereken diğer özellikler, oyuncular sadece listenin dışında olduğunu daha sonra anladım. Örneğin, puan çalışan toplam bu sezon, mevcut bütçeden, üniforma renkleri string
bir takım adına temsil eden, vb
O zaman bence
Tamam, bir futbol takımı sadece oyuncu listesi gibi, ama ayrıca, bir adı (
string
) puan (int
) çalışan bulunuyor. .NET kendi sınıfıma yapacağım bu yüzden futbol takımları depolamak için bir sınıf sağlamaz. En benzer ve ilgili mevcut yapı edeceğim ondan miras ...List<FootballPlayer>
,:class FootballTeam : List<FootballPlayer> { public string TeamName; public int RunningTotal }
Ama a guideline says you shouldn't inherit from List<T>
çıkıyor. İyice iki açıdan bu kılavuz kafamı karıştırdı.
Neden olmasın?
Görünüşe göre List
is somehow optimized for performance. Nasıl yani? Performans sorunları I List
uzatıyorum varsa ne olacak? Tam olarak sonu ne olacak?
Gördüğüm bir başka nedeni List
Microsoft tarafından sağlanan ve üzerinde hiçbir kontrole sahip, I cannot change it later, after exposing a "public API". Ama ben bunu anlamakta zorlanıyorum. Ortak bir API nedir ve neden umursayayım? Eğer benim şimdiki proje ve şimdiye kadar bu kamu API olması muhtemel değil mi eğer değilse, güvenli bir şekilde bu kuralı görmezden gelebilir miyim? List
miras yaparsamveortak bir API ihtiyacım var, zorluklar var, ne olacak?
Neden bunun bir önemi var mı? Bir liste. Muhtemelen neyi değiştirebilirsin ki? Ben muhtemelen değiştirmek için ne ister?
Ve eğer Microsoft beni mi yoksa son olarak, List
neden sınıf yapmak değildi devralır sealed
?
Başka ne yapmam gerekiyor ki?
Görünüşe göre, özel koleksiyonlar için, Microsoft List
yerine genişletilmiş olmalıdır Collection
sınıf sağlamıştır. Ama bu sınıf çok çıplak ve çok yararlı şeyler var değildir such as AddRange
mesela. jvitor83's answer sağlayan özel yöntem performans için bir gerekçe, ama nasıl bir AddRange
AddRange
hayır daha iyi değil yavaş?
Collection
miras List
, devralmasını daha çok iş var ve hiçbir fayda görüyorum. Kesinlikle Microsoft bana söylemiyordu için ekstra çalışma için bir sebep yok, o yüzden yardımcı olamam gibi hissediyorum Ben bir şekilde yanlış bir şey, ve devralma Collection
aslında doğru çözüm için benim sorunum.
IList
uygulanması gibi öneriler gördüm. Sadece hayır. Bu bana hiçbir şey kazanmaz. demirbaş kod satırları onlarca.
Son olarak, bazı List
kaydırma bir şeye işaret ediyor:
class FootballTeam
{
public List<FootballPlayer> Players;
}
Bu iki sorunu vardır:
Benim kod gereksiz yere ayrıntılı yapar. Şimdi sadece 28 ** yerine
my_team.Players.Count
aramalıyım. Neyse ki, C# ile dizin oluşturucu dizin şeffaf ve dahili tüm yöntemleri ve ilerleyin tanımlayabilirList
... Ama bu kod bir sürü var! Ben tüm bu iş için ne alabilirim?Bu sadece düz mantıklı değil. Bir futbol takımı "" oyuncu listesi yok.oyuncuların listesi. Söyleme "John McFootballer SomeTeam oyuncular katıldı". "John SomeTeam katıldı". Bir mektup eklemeyeceksin "bir dize karakterleri", bir dize için bir mektup ekleyin. Bir kütüphane kitap için bir kitap eklemek değilsin, bir kütüphane için bir kitap ekleyin.
Farkındayım ne olur "under the hood" olduğu söylenebilir "ekleyerek X Y iç liste" ama bu gibi bir çok mantıksız şekilde düşünüyor dünya.
Benim sorum (özetlenmiş)
Nedir doğru C# şekilde temsil eden bir veri yapısı olan, "mantıklı" (yani, "insan aklı") sadece list
things
ile bir kaç çan ve ıslık?
List<T>
devralmasını her zaman kabul edilemez? Ne zaman kabul edilebilir? Neden/neden olmasın? Bir programcı için karar vermeden List<T>
miras zaman düşünmek için ne yapmalıyız?
CEVAP
Bazı iyi cevaplar var. Onları aşağıdaki hususları eklemek istiyorum.
Nedir doğru C# şekilde temsil eden bir veri yapısı olan, "mantıklı" (yani, "insan aklı") sadece bir liste ile bir kaç çan ve ıslık?
Futbol aşina boş doldurmak için bir on non-bilgisayar programcısı insanlar soruyor:
A football team is a particular kind of _____
Yaptıherkes"birkaç çan ve ıslık ile futbolcular listesi" dediler "" veya "" veya""? organizasyon kulübü spor takımı demek Düşünceniz bir futbol takımı olduğunuoyuncu listesi belli bir türinsan aklını ve insan aklının tek başına.
List<T>
mekanizması. Futbol takımınıniş nesnesiyani, bir nesnenin içinde olan bazı kavram temsil ederiş alanıprogramın. Yok o karışımı! Bir futbol takımıbir türtakım;bir vardırliste, bir listeoyuncu listesi. Bir liste değiloyuncu listesi belli tür. Bir listeoyuncu listesi. List<Player>
bir özellik Roster
denir. Ve bir futbol takımı hakkında bilgisi olan herkesin listesi oyuncular silmek için alır eğer inanmazsan bunu yaparken ReadOnlyList<Player>
.
List<T>
devralmasını her zaman kabul edilemez?
Kim için kabul edilemez? Bana? Hayır.
Ne zaman kabul edilebilir?
Bir mekanizma bir bina oluyoruzatır List<T>
mekanizma.
Bir programcı için karar vermeden
List<T>
miras zaman düşünmek için ne yapmalıyız?
Ben bir binamekanizmasıya da biriş nesnesi?
Ama bu kod bir sürü var! Ben tüm bu iş için ne alabilirim?
List<T>
ilgili üyeleri elli kat daha fazla zamanın iletme yöntemleri yazmak için almış olmalı sorunuzu yazarak geçirdin. Açıkça ayrıntı korkmuyorsun, ve kod küçük bir miktar paradan söz ediyoruz; bu bir kaç dakikalık iş.
GÜNCELLEME
Biraz daha düşündüm ve oyuncu listesi gibi bir futbol takımı model için değil başka bir nedeni var. Aslında sadece bir futbol takımı olarak model için kötü bir fikir olabilirsahipoyuncular listesini de. Takım/oyuncu listesine sahip derdin ne olduğunuanlık görüntütakımzaman içinde bir an. Bilmiyorum ne iş böyledir bu sınıf, ama eğer bir sınıfı temsil edilen bir futbol takımı istiyorum istiyorum iste bu gibi sorular "kaç Seahawks oyuncular cevapsız oyunları nedeniyle yaralanma arasında 2003 ve 2013?" veya "Ne Denver oyuncusu daha önce oynanan başka bir takım vardı en büyüğü yıldan yıllık artış metre koştu?" veya "Did the Piggers go all the way this year?"
Yani, bir futbol takımı benim için iyi modellenmiş gibi görünüyortarihi gerçekleri bir koleksiyonbir oyuncu olarak işe başladı gibi, yaralı, emekli, vb. Açıkçası kadrosu muhtemelen ön ve merkezi olması gereken önemli bir gerçektir, ama bu yapmak istediğiniz diğer ilginç şeyler olabilir geçerli oyuncu daha tarihsel bir bakış açısı gerektiren nesne.
Neden ICollection ve IEnumerable veya ...
Neden Listesi<T>.Dosyalarda grup...
Neden-exec mv bulmak için {} ./hedef/ ...
Neden IEnumerable<T>.ToList<T...
Neden üye başlatma listesi kullanmayı ...