Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uyarı
Bu içerik, Çerçeve Tasarım Yönergeleri: Kurallar, Deyimler ve Yeniden Kullanılabilir .NET Kitaplıkları için Desenler, 2. Sürüm'den Pearson Education, Inc.'in izniyle yeniden yazdırılır. Bu baskı 2008'de yayımlandı ve kitap o zamandan beri üçüncü baskıda tamamen revize edilmiştir. Bu sayfadaki bazı bilgiler güncel olmayabilir.
Belirli bir ortak özelliğe sahip bir nesne grubunu işlemek için özel olarak tasarlanmış herhangi bir tür koleksiyon olarak kabul edilebilir. Bu türler için IEnumerable veya IEnumerable<T> arabirimini uygulamak neredeyse her zaman uygundur, bu yüzden bu bölümde yalnızca bu arabirimlerden birini veya her ikisini uygulayan türleri koleksiyon olarak kabul ediyoruz.
❌ Genel API'lerde zayıf türlenmiş koleksiyonlar KULLANMAYIN.
Koleksiyon öğelerini temsil eden tüm dönüş değerlerinin ve parametrelerinin türü, temel türlerinden herhangi biri değil tam öğe türü olmalıdır (bu yalnızca koleksiyonun genel üyeleri için geçerlidir).
❌Genel API'lerde ArrayList veya List<T> kullanmayın.
Bu türler, genel API'lerde değil iç uygulamada kullanılmak üzere tasarlanmış veri yapılarıdır.
List<T>, API'lerin temizliği ve esnekliğinden ödün verilerek performans ve güç için optimize edilmiştir. Örneğin, List<T> geri döndürürseniz, istemci kodu koleksiyonu değiştirdiğinde bildirim alamazsınız. Ayrıca, List<T>, birçok senaryoda yararlı veya geçerli olmayan BinarySearch gibi birçok öğeyi kullanıma sunar. Aşağıdaki iki bölümde, genel API'lerde kullanılmak üzere özel olarak tasarlanmış türler (soyutlamalar) açıklanmaktadır.
❌Genel API'lerde Hashtable veya Dictionary<TKey,TValue> kullanmayın.
Bu türler, iç uygulamada kullanılmak üzere tasarlanmış veri yapılarıdır. Genel API'ler IDictionary, IDictionary <TKey, TValue> veya arabirimlerden birini veya her ikisini uygulayan özel bir tür kullanmalıdır.
❌ Bir IEnumerator<T>, IEnumerator veya bu arabirimlerden birini uygulayan herhangi başka bir türü, bir GetEnumerator yönteminin dönüş türü hariç KULLANMAYIN.
GetEnumerator dışındaki yöntemlerden numaralandırıcı döndüren türler, foreach ifadesiyle kullanılamaz.
❌ Her ikisini de IEnumerator<T> ve IEnumerable<T> aynı türde UYGULAMAYIN. Aynı durum, nongeneric arabirimleri IEnumerator ve IEnumerable için de geçerlidir.
Koleksiyon Parametreleri
✔️ DO, parametre türü olarak mümkün olan en az özelleştirilmiş türü kullanın. Koleksiyonları parametre olarak alan üyelerin çoğu arabirimini IEnumerable<T> kullanır.
❌ özelliğe erişmek için ICollection<T> veya ICollection'yi bir parametre olarak kullanmaktan KAÇININ.
Bunun yerine IEnumerable<T> veya IEnumerable kullanmayı ve nesnenin ICollection<T> veya ICollection uygulayıp uygulamadığını dinamik olarak denetlemeyi göz önünde bulundurun.
Koleksiyon Özellikleri ve Dönüş Değerleri
❌ Ayarlanabilir koleksiyon özellikleri VERMEYİN.
Kullanıcılar önce koleksiyonu temizleyip ardından yeni içeriği ekleyerek koleksiyonun içeriğini değiştirebilir. Bütün koleksiyonu değiştirmek yaygın bir senaryoysa, koleksiyona AddRange yöntemini sağlamayı düşünün.
✔️ Okuma/yazma koleksiyonlarını temsil eden özellikler veya dönüş değerleri için Collection<T> veya bir alt sınıfı Collection<T> kullanın.
Eğer Collection<T> bazı gereksinimleri karşılamıyorsa (örneğin, koleksiyon IList'i uygulamamalıdır), IEnumerable<T>, ICollection<T> veya IList<T> uygulayarak özel bir koleksiyon kullanın.
✔️ DO, salt okunur koleksiyonları temsil eden özellikler veya dönüş değerleri için, ReadOnlyCollection<T>, ReadOnlyCollection<T> alt sınıfını veya nadir durumlarda IEnumerable<T> kullanın.
Genel olarak tercih edin ReadOnlyCollection<T>. Bazı gereksinimleri karşılamıyorsa (örneğin, koleksiyon IList implement etmemelidir), IEnumerable<T>, ICollection<T> veya IList<T> uygulayarak özel bir koleksiyon kullanın. Özel bir salt okunur koleksiyon uyguluyorsanız, ICollection<T>.IsReadOnly uygulayın ve true döndürün.
Desteklemek isteyeceğiniz tek senaryonun yalnızca ileriye doğru yineleme olduğundan emin olduğunuz durumlarda, kullanabilirsiniz IEnumerable<T>.
✔️ Koleksiyonları doğrudan kullanmak yerine genel temel koleksiyonların alt sınıflarını kullanmayı göz önünde bulundurun.
Bu, daha iyi bir ad ve temel koleksiyon türlerinde mevcut olmayan yardımcı üyeler eklemeye olanak tanır. Bu özellikle üst düzey API'ler için geçerlidir.
✔️ Çok yaygın olarak kullanılan yöntem ve özelliklerden Collection<T> veya ReadOnlyCollection<T> alt sınıfını döndürmeyi GÖZ ÖNÜNDE BULUNDURUN.
Bu, gelecekte yardımcı yöntemler eklemenize veya koleksiyon uygulamasını değiştirmenize olanak sağlar.
✔️ Koleksiyonda depolanan öğelerin benzersiz anahtarları (adlar, kimlikler vb.) varsa anahtarlı bir koleksiyon kullanmayı göz önünde bulundurun. Anahtarlı koleksiyonlar, hem anahtar hem de tamsayı ile indekslenebilen ve genellikle KeyedCollection<TKey,TItem> öğesinden devralınarak uygulanan koleksiyonlardır.
Anahtarlı koleksiyonlar genellikle daha büyük bellek ayak izlerine sahiptir ve bellek yükü anahtarlara sahip olmanın avantajlarından daha fazlaysa kullanılmamalıdır.
❌ Koleksiyon özelliklerinden veya koleksiyon döndüren yöntemlerden null değerler DÖNDÜRMEYİnİZ. Bunun yerine boş bir koleksiyon veya boş bir dizi döndürür.
Genel kural, null ve boş (0 öğe) koleksiyonlarının veya dizilerinin aynı şekilde ele alınması gerektiğidir.
Anlık Görüntüler ve Canlı Koleksiyonlar Karşılaştırması
Belirli bir noktada bir durumu temsil eden koleksiyonlar anlık görüntü koleksiyonları olarak adlandırılır. Örneğin, veritabanı sorgusundan döndürülen satırları içeren bir koleksiyon anlık görüntü olabilir. Her zaman geçerli durumu temsil eden koleksiyonlar canlı koleksiyonlar olarak adlandırılır. Örneğin, bir ComboBox nesne koleksiyonu canlı bir koleksiyondur.
❌ Anlık görüntü koleksiyonlarını özelliklerden DÖNDÜRMEYİN. Özellikler canlı koleksiyonlar döndürmelidir.
Özellik alıcıları çok hafif işlemler olmalıdır. Anlık görüntü döndürmek için O(n) işleminde bir iç koleksiyonun kopyasının oluşturulması gerekir.
✔️ Geçici (yani koleksiyonu açıkça değiştirmeden değişebilen) koleksiyonları temsil etmek için anlık görüntü koleksiyonu veya canlı IEnumerable<T> (veya onun alt türü) kullanın.
Genel olarak, paylaşılan kaynağı temsil eden tüm koleksiyonlar (örneğin, bir dizindeki dosyalar) geçicidir. Uygulama yalnızca ileriye doğru bir numaralandırıcı olmadığı sürece bu tür koleksiyonların canlı koleksiyon olarak uygulanması çok zordur veya imkansızdır.
Diziler ve Koleksiyonlar Arasında Seçim
✔️ DO, diziler yerine koleksiyonları tercih eder.
Koleksiyonlar içerik üzerinde daha fazla denetim sağlar, zaman içinde gelişebilir ve daha kullanılabilir. Ayrıca, salt okunur senaryolar için dizilerin kullanılması önerilmez çünkü diziyi kopyalamanın maliyeti yüksektir. Kullanılabilirlik çalışmaları, bazı geliştiricilerin koleksiyon tabanlı API'leri daha rahat kullandıklarını göstermiştir.
Ancak, alt düzey API'ler geliştiriyorsanız, okuma-yazma senaryoları için dizileri kullanmak daha iyi olabilir. Diziler, kullanılan hafıza miktarını azaltmaya yardımcı olan daha az yer kaplar ve çalışma zamanı tarafından optimize edildiği için dizideki öğelere erişim daha hızlıdır.
✔️ Bellek tüketimini en aza indirmek ve performansı en üst düzeye çıkarmak için alt düzey API'lerde dizileri kullanmayı göz önünde bulundurun.
✔️ DO, bayt koleksiyonları yerine bayt dizileri kullanır.
❌ Özellik alıcısı her çağrıldığında özelliğin yeni bir dizi (örneğin, bir iç dizinin kopyası) döndürmesi gerekiyorsa, özellikler için dizileri KULLANMAYIN.
Özel Koleksiyonları Uygulamak
✔️ Yeni koleksiyonlar tasarlarken Collection<T>, ReadOnlyCollection<T> veya KeyedCollection<TKey,TItem> devralmayı GÖZ ÖNÜNDE BULUNDURUN.
Yeni koleksiyonlar tasarlarken IEnumerable<T> uygulayın. Mantıklı olduğu yerde ICollection<T> veya hatta IList<T> uygulamayı göz önünde bulundurun.
Bu tür özel koleksiyonları uygularken, Collection<T> ve ReadOnlyCollection<T> ile belirlenen API desenini mümkün olduğunca yakından izleyin. Başka bir deyişle, aynı üyeleri açıkça uygulayın, bu iki koleksiyon gibi parametreleri adlandırın ve bu şekilde devam edin.
✔️ Koleksiyon genellikle bu arabirimleri giriş olarak alan API'lere geçirilecekse, genel olmayan koleksiyon arabirimlerini (IList ve ICollection) uygulamayı GÖZ ÖNÜNDE BULUNDURUN.
❌ Koleksiyon kavramıyla ilgisi olmayan karmaşık API'lere sahip türlerde koleksiyon arabirimleri uygulamaktan KAÇıNıN.
❌ Genel olmayan temel koleksiyonlardan, örneğin CollectionBase, DEVRALMAYIN. Bunun yerine Collection<T>, ReadOnlyCollection<T>ve KeyedCollection<TKey,TItem> kullanın.
Özel Koleksiyonları Adlandırma
Koleksiyonlar (uygulayan IEnumerabletürler) esas olarak iki nedenden dolayı oluşturulur: (1) yapıya özgü işlemler içeren yeni bir veri yapısı oluşturmak ve genellikle mevcut veri yapılarından farklı performans özellikleri (örneğin, List<T>, , LinkedList<T>Stack<T>) ve (2) belirli bir öğe kümesini tutmak için özelleştirilmiş bir koleksiyon oluşturmak için (örneğin, StringCollection). Veri yapıları genellikle uygulamaların ve kitaplıkların iç uygulamasında kullanılır. Özel koleksiyonlar temel olarak API'lerde kullanıma sunulur (özellik ve parametre türleri olarak).
✔️ "Dictionary" sonekini, IDictionary uygulayan soyutlamaların isimlerinde kullanın.
✔️ DO, IEnumerable'ı (veya alt öğelerinden herhangi birini) uygulayan ve bir öğe listesini temsil eden türlerin adlarında "Koleksiyon" sonekini kullanın.
✔️ DO, özel veri yapıları için uygun veri yapısı adını kullanın.
❌ Koleksiyon soyutlamalarının adlarında "LinkedList" veya "Hashtable" gibi belirli bir uygulamayı ima eden sonekleri kullanmaktan KAÇıNıN.
✔️ Koleksiyon adlarının ön ekini öğe türünün adıyla eklemeyi düşünün. Örneğin, türündeki Address öğeleri depolayan (uygulayan IEnumerable<Address>) bir koleksiyon olarak adlandırılmalıdır AddressCollection. Öğe türü bir arabirimse, öğe türünün "I" ön eki atlanabilir. Bu nedenle, bir öğe koleksiyonu IDisposable olarak adlandırılabilir DisposableCollection.
✔️ Karşılık gelen bir yazılabilir koleksiyon eklenmiş veya çerçevede zaten mevcut olabilirse, salt okunur koleksiyonların adlarında "ReadOnly" ön ekini kullanmayı göz önünde bulundurun.
Örneğin, salt okunur bir dize koleksiyonu olarak adlandırılmalıdır ReadOnlyStringCollection.
Porsiyonlar © 2005, 2009 Microsoft Corporation. Tüm hakları saklıdır.
Pearson Education, Inc. tarafından Krzysztof Cwalina ve Brad Abrams'ın Yeniden Kullanılabilir .NET Kütüphaneleri için Çerçeve Tasarım Yönergeleri: Sözleşmeler, Deyimler ve Kalıplar, 2. Baskı eserinden izniyle yeniden basılmıştır. Addison-Wesley Professional tarafından Microsoft Windows Geliştirme Serisi kapsamında 22 Ekim 2008'de yayımlanmıştır.