Programlarımı planlarken, genellikle şöyle bir düşünce zinciriyle başlarım:
Bir futbol takımı sadece futbolcuların bir listesidir. Bu nedenle, şunu temsil etmeliyim:
var football_team = new List<FootballPlayer>();
Bu listenin sıralaması, oyuncuların kadroda listelendiği sırayı temsil eder.
Ancak daha sonra, takımların sadece oyuncu listesinin yanı sıra kaydedilmesi gereken başka özellikleri de olduğunu fark ediyorum. Örneğin, bu sezonun toplam skoru, mevcut bütçe, tekdüze renkler, string
takımın adını temsil eden, vb.
Sonra düşünüyorum:
Tamam, bir futbol takımı sadece bir oyuncu listesi gibidir, ancak ek olarak, bir adı (a
string
) ve çalışan toplam skorları (anint
) vardır. .NET, futbol takımlarını saklamak için bir sınıf sağlamaz, bu yüzden kendi sınıfımı yapacağım. En benzer ve ilgili mevcut yapıList<FootballPlayer>
, bu yüzden miras alacağım:class FootballTeam : List<FootballPlayer> { public string TeamName; public int RunningTotal }
Ancak bir kılavuzun miras kalmamanız gerektiğini söylediğiList<T>
ortaya çıkıyor . Bu rehberle iki açıdan tamamen kafam karıştı.
Neden olmasın?
Görünüşe göre List
performans için bir şekilde optimize edilmiştir . Nasıl yani? Genişletirsem hangi performans sorunlarına neden olurum List
? Tam olarak ne kırılacak?
Gördüğüm başka bir neden List
, Microsoft tarafından sağlanan ve üzerinde herhangi bir kontrole sahip değilim , bu yüzden bir "genel API" açtıktan sonra daha sonra değiştiremiyorum . Ama bunu anlamak için mücadele ediyorum. Herkese açık bir API nedir ve neden ilgilenmeliyim? Şu anki projemde bu herkese açık API bulunmuyorsa ve bu olasılığa sahip değilse, bu kılavuzu göz ardı edebilir miyim? Eğer miras alırsamList
ve genel bir API'ya ihtiyacım olduğu ortaya çıkarsa, ne tür zorluklar yaşayacağım?
Neden önemli? Liste bir listedir. Ne değişebilirdi? Neyi değiştirmek isteyebilirim?
Ve son olarak, Microsoft benim miras almamı istemiyorsa List
, neden sınıfı yapmadılarsealed
?
Başka ne kullanmam gerekiyor?
Görünüşe göre, özel koleksiyonlar için Microsoft, Collection
bunun yerine genişletilmesi gereken bir sınıf sağlamıştır List
. Ancak bu sınıf çok çıplaktır ve örneğinAddRange
, pek çok yararlı şeyi yoktur . jvitor83'ün cevabı , bu belirli yöntem için bir performans mantığı sağlar, ancak bir yavaş nasıl hayırdanAddRange
daha iyi değil AddRange
?
Devralmak, Collection
devralmaktan çok daha fazla iştir List
ve hiçbir fayda görmüyorum. Şüphesiz Microsoft bana hiçbir sebepten ötürü fazladan iş yapmamı söylemedi, bu yüzden bir şekilde bir şeyi yanlış anlıyormuşum gibi hissetmeme yardım edemiyorum ve kalıtım Collection
aslında problemim için doğru çözüm değil.
Uygulama gibi öneriler gördüm IList
. Sadece hayır. Bu bana hiçbir şey kazandıran düzinelerce boyunda kod satırı.
Son olarak, bazıları bir List
şeye sarmayı önerir :
class FootballTeam
{
public List<FootballPlayer> Players;
}
Bununla birlikte iki tane sorun var:
Kodumu gereksiz yere ayrıntılı yapar. Şimdi
my_team.Players.Count
sadece yerine çağırmalıyımmy_team.Count
. Neyse ki, C # ile indekslemeyi şeffaf hale getirmek ve dahili tüm yöntemleri iletmek için indeksleyicileri tanımlayabilirimList
... Ama bu çok fazla kod! Tüm bu işler için ne alacağım?Sadece sade bir anlam ifade etmiyor. Bir futbol takımının oyuncu listesi "yoktur". Bu ise oyuncuların listesi. "John McFootballer SomeTeam oyuncularına katıldı" demiyorsunuz. "John SomeTeam'e katıldı" diyorsunuz. "Bir dizenin karakterlerine" bir harf eklemezsiniz, bir dizeye bir harf eklersiniz. Bir kitaplığın kitaplarına kitap eklemezsiniz, kitaplığa bir kitap eklersiniz.
"Kaputun altında" olan şeyin "Y'nin iç listesine X eklenmesi" olduğu söylenebilir, ancak bu dünya hakkında oldukça sezgisel bir düşünme yolu gibi görünüyor.
Sorum (özetlendi)
"Mantıksal" ( "insan beynine" demek olduğunu) sadece bir veri yapısını temsil doğru C # yolu nedir list
ait things
birkaç çan ve ıslık ile?
Her List<T>
zaman kabul edilemez mi? Ne zaman kabul edilebilir? Neden / neden olmasın? Bir programcı, miras alıp almamaya karar verirken neleri dikkate almalıdır List<T>
?
string
Her şey yapmasını gerektiren durumlar object
yapabileceği daha .