Neden C # Hashtable yerine Sözlük tercih edilir?


1395

Çoğu programlama dilinde, sözlükler karma tablolara göre tercih edilir. Bunun arkasındaki nedenler nelerdir?


21
> Bu her zaman doğru değildir. Karma tablo, sözlüğün bir uygulamasıdır. Tipik olanıdır ve .NET'teki varsayılan olabilir, ancak tanım gereği tek değildir. Bunun ECMA standardı için gerekli olduğundan emin değilim, ancak MSDN belgeleri açıkça açıkça bir hashtable olarak uygulandığını söylüyor. Bir alternatifin daha makul olduğu zamanlar için SortedList sınıfını bile sağlarlar.
ProMit

15
@Promit Her zaman bunun Dictionarybir uygulaması olduğunu düşündüm Hashtable.
b1nary.atr0phy

2
Bence neden, sözlükte anahtarın türünü ve kendiniz için değeri tanımlayabilirsiniz. Hashtable yalnızca nesneleri alabilir ve çiftleri karmaya dayalı olarak kaydeder (object.GetHashCode () öğesinden).
Radinator

2
@Dan Talebiniz oldukça yanlış ... bir karma tablo her anahtarın yalnızca bir örneğini içerir ve bir arama hiçbir zaman birden fazla girdi vermez; her anahtarla birden çok değeri ilişkilendirmek istiyorsanız, karma tablosu değerini bir değerler listesi yapın. "Sözlük" diye bir veri yapısı yoktur ... Sözlük, bazı kütüphanelerin karma tabloları için kullandıkları isimdir. örneğin, C # 'ın jenerik olmayan karma tablosu çağrılır HashTable. Dile jenerikler eklediklerinde genel sürümü çağırdılar Dictionary. Her ikisi de karma tablolar.
Jim Balter

3
@Dan Talebiniz yanlış ... bir karma tablo ( en.wikipedia.org/wiki/Hash_table ) sözlüğün belirli bir uygulamasıdır, yani ilişkilendirilebilir bir dizi ( en.wikipedia.org/wiki/Associative_array ) ve sözlük, her anahtarın yalnızca bir örneğini içerir ve arama hiçbir zaman birden fazla girdi vermez; her anahtarla birden çok değeri ilişkilendirmek istiyorsanız, karma tablosu değerini bir değerler listesi yapın. Ve .NET Dictionary ve Hashtable sınıflarının her ikisi de karma tablolarıdır.
Jim Balter

Yanıtlar:


1568

Ne 's değerinde, bir sözlük olan (kavramsal) bir karma tablo.

"Neden Dictionary<TKey, TValue>sınıf yerine Hashtablesınıfı kullanıyoruz?" Demek istiyorsanız , bu kolay bir cevaptır: Dictionary<TKey, TValue>genel bir tür, Hashtabledeğil. Bu, tür güvenliğine sahip olduğunuz anlamına gelir Dictionary<TKey, TValue>, çünkü içine rastgele bir nesne ekleyemezsiniz ve aldığınız değerleri kullanmanız gerekmez.

İlginçtir, Dictionary<TKey, TValue>.NET Framework'teki uygulama Hashtable, kaynak kodunda bu yorumdan anlayabileceğiniz gibi:

Genel Sözlük Hashtable'ın kaynağından kopyalandı

Kaynak


393
Ayrıca boks / kutudan çıkma olmadığı için genel koleksiyonlar çok daha hızlıdır
Chris S

6
Yukarıdaki ifade ile bir Hashtable hakkında emin değilim, ancak ArrayList vs Liste <t> için doğru
Chris S

36
Hashtable, nesneleri dahili olarak tutmak için Object'i kullanır (Bunu yapmak için yalnızca jenerik olmayan bir yol), böylece kutuyu / kutuyu açması gerekir.
Guvante

16
@BrianJ: "Karma tablo" (iki kelime), bu tür bir yapı için bilgisayar bilimi terimidir; Sözlük belirli bir uygulamadır. Bir HashTable kabaca bir Dictionary <object, object> (biraz farklı arayüzlerde olsa da) ile eşleşir, ancak her ikisi de karma tablo kavramının uygulamalarıdır. Ve elbette, sadece konuları daha da karıştırmak için, bazı diller kendi karma tablolarına "sözlükler" (örn. Python) derler - ancak uygun CS terimi hala karma tablodur.
Michael Madsen

32
@BrianJ: Hem HashTable(sınıf) hem de Dictionary(sınıf) hash tablolarıdır (kavram), ancak a HashTablea değil Dictionary, ne de Dictionarya HashTable. Çok benzer modalarda kullanılırlar ve Dictionary<Object,Object>a'nın HashTableyaptığı gibi türlenmemiş bir şekilde hareket edebilirler , ancak herhangi bir kodu doğrudan paylaşmazlar (ancak parçalar çok benzer bir şekilde uygulanacaktır).
Michael Madsen

625

Dictionary<<< >>> Hashtablefarklılıklar:

  • Jenerik <<< >>> Jenerik Olmayan
  • İhtiyaç kendi iplik senkronizasyonu <<< >>> Teklifler parçacığı güvenli aracılığıyla sürümünü Synchronized()yöntemine
  • Numaralandırılmış ürün: KeyValuePair<<< >>> Numaralandırılmış ürün:DictionaryEntry
  • Daha yeni (> .NET 2.0 ) <<< >>> Daha eski ( .NET 1.0'dan beri )
  • olduğu System.Collections.Generic <<< >>> olduğu System.Collections
  • Varolmayan anahtara istek istisna atar <<< >>> Varolmayan anahtara istek null değerini döndürür
  • değer türleri için potansiyel olarak biraz daha hızlı <<< >>> değer türleri için biraz daha yavaş (boks / kutudan çıkarma gerekir)

Dictionary/ Hashtablebenzerlikler:

  • Her ikisi de dahili olarak hashtables == anahtara göre birçok öğeye hızlı erişim
  • Her ikisi de değişmez ve benzersiz tuşlara ihtiyaç duyar
  • Her ikisinin de anahtarları kendi GetHashCode()yöntemine ihtiyaç duyar

Benzer .NET koleksiyonları (Dictionary ve Hashtable yerine kullanılacak adaylar):

  • ConcurrentDictionary- diş güvenli (aynı anda birkaç dişten güvenli bir şekilde erişilebilir)
  • HybridDictionary- optimize edilmiş performans (birkaç öğe için ve ayrıca birçok öğe için)
  • OrderedDictionary- değerlere int indeksi üzerinden erişilebilir (öğelerin eklendiği sıraya göre)
  • SortedDictionary- öğeler otomatik olarak sıralanır
  • StringDictionary- güçlü bir şekilde yazılmış ve dizeler için optimize edilmiştir

11
@ Guillaume86, bu yüzden TryGetValue yerine msdn.microsoft.com/en-us/library/bb347013.aspx
Trident D'Gao

2
+1 için StringDictionary... btw StringDictionary, Dictionary<string, string>varsayılan kurucuyu kullandığınızla aynı değildir .
Cheng Chen

ParallelExtensionsExtras @ code.msdn.microsoft.com/windowsdesktop/… , eşzamanlılığın yanı sıra harika köknar bağlama özelliği olan bir ObservableConcurrentDictionary içerir.
VoteCoffee

3
harika bir açıklama, aklınıza gelebilecek soruları azaltmak için benzerlikleri de listelemeniz gerçekten çok güzel
mkb


178

Çünkü Dictionarygenel bir sınıf ( Dictionary<TKey, TValue>) olduğundan, içeriğine erişmek tür güvenlidir (yani a ile yaptığınız Objectgibi yayınlamanız gerekmez Hashtable).

Karşılaştırmak

var customers = new Dictionary<string, Customer>();
...
Customer customer = customers["Ali G"];

için

var customers = new Hashtable();
...
Customer customer = customers["Ali G"] as Customer;

Ancak, Dictionarydahili olarak karma tablo olarak uygulanır, bu nedenle teknik olarak aynı şekilde çalışır.


88

FYI: .NET'te, Hashtablebirden çok okuyucu iş parçacığı ve tek bir yazma iş parçacığı tarafından kullanım Dictionaryiçin iş parçacığı güvenli, genel statik üyelerde iş parçacığı güvenli, ancak herhangi bir örnek üyelerinin iş parçacığı güvenli olduğu garanti edilmez.

Bu Hashtablenedenle tüm Sözlüklerimizi tekrar değiştirmek zorunda kaldık .


10
Eğlence. Sözlük <T> kaynak kodu çok daha temiz ve hızlı görünüyor. Sözlük'ü kullanmak ve kendi senkronizasyonunuzu uygulamak daha iyi olabilir. Sözlük okumalarının kesinlikle güncel olması gerekiyorsa, sözlüğün okuma / yazma yöntemlerine erişimi senkronize etmeniz yeterlidir. Çok fazla kilitleme olurdu, ama doğru olurdu.
Triynko

10
Alternatif olarak, okumalarınızın kesinlikle güncel olması gerekmiyorsa, sözlüğü değiştirilemez olarak değerlendirebilirsiniz. Daha sonra, sözlüğe bir referans alabilir ve okumaları hiç senkronize etmeyerek performans elde edebilirsiniz (değişmez ve doğal olarak iş parçacığı için güvenli olduğundan). Güncellemek için, arka planda Sözlüğün tam güncellenmiş bir kopyasını oluşturun, ardından başvuruyu Interlocked.CompareExchange ile değiştirin (tek bir yazma iş parçacığı varsayarak, birden çok yazma iş parçacığı güncelleştirmelerin eşitlenmesini gerektirir).
Triynko

38
.Net 4.0, ConcurrentDictionaryiş parçacığı için güvenli olacak şekilde uygulanan tüm genel / korumalı yöntemleri içeren sınıfı ekledi . Eski platformları desteklemeniz gerekmiyorsa, bu Hashtable, çok iş parçacıklı kodun yerini almanıza izin verir : msdn.microsoft.com/en-us/library/dd287191.aspx
Dan Is Fiddling By Firelight

kurtarmaya anonim. Güzel cevap.
unkulunkulu

5
HashTable'ın bilgilerin tablodan asla silinmediği senaryoda yalnızca okuyucu-yazar iş parçacığı için güvenli olduğunu hatırlıyorum. Bir okuyucu farklı bir öğe silinirken tablodaki bir öğeyi istiyorsa ve okuyucu öğe için birden fazla yere bakacaksa, okuyucu ararken yazarı öğeyi taşıyabilir incelenmemiş bir yerden, daha önce yapılmış olandan yanlış bir rapora yol açar.
supercat

68

.NET'te Dictionary<,>ve arasındaki fark HashTableesas olarak eski türün genel bir tür olmasıdır, bu nedenle statik tür denetimi (ve azaltılmış boks) açısından jeneriklerin tüm avantajlarından faydalanırsınız, ancak bu insanların düşünmeye meyilli olduğu kadar büyük değildir. performans açısından - boks için kesin bir bellek maliyeti var).


34

İnsanlar bir sözlüğün karma tablo ile aynı olduğunu söylüyor.

Bu mutlaka doğru değildir. Karma tablo, sözlük uygulamanın bir yoludur . Tipik olanıdır ve .NET'te varsayılanDictionary sınıftaki , ancak tanım gereği tek değildir.

Bağlantılı bir liste veya arama ağacı kullanarak bir sözlüğü eşit derecede iyi uygulayabilirsiniz, bu kadar verimli olmazdı (bazı verimli metrikler için).


4
MS dokümanları: "Anahtarını kullanarak bir değeri almak çok hızlıdır, O (1) 'e yakındır, çünkü Dictionary <(Of <(TKey, TValue>)>) sınıfı bir karma tablosu olarak uygulanır." - bu yüzden uğraşırken bir hashtable garanti edilmelidir Dictionary<K,V>. IDictionary<K,V>olsa bir şey olabilir :)
snemarch

13
@ rix0rrr - Sanırım bunu geriye aldınız, bir Sözlük bir HashTable kullanmıyor, bir HashTable sözlük kullanmıyor.
Joseph Hamilton

8
@JosephHamilton - rix0rrr doğru anladım: "Bir karma tablo olan bir bir uygulamasıdır Sözlük ." Sınıf değil, "sözlük" kavramı anlamına gelir (küçük harfe dikkat edin). Kavramsal olarak, bir karma tablosu sözlük arabirimini uygular. .NET'te Sözlük, IDictionary uygulamak için bir karma tablo kullanır. Dağınık;)
Robert Hensing

Onun cevabında atıfta bulunduğu şey .NET'ten bahsediyordum.
Joseph Hamilton

2
@ Josephephilton: Uygulamanın (veya uygulanmasının ) uzaktan kullanımla aynı şey olduğu anlamına gelmez . Tam tersi. Belki biraz farklı bir şekilde söylerse daha açık olurdu (ama aynı anlamı ile): "bir karma tablo sözlük uygulamanın bir yoludur". Yani, bir sözlüğün işlevselliğini istiyorsanız, bunu yapmanın bir yolu ( sözlüğü uygulamak için) bir hashtable kullanmaktır.
ToolmakerSteve

21

Collections& Genericsnesne grubunu işlemek için kullanışlıdır. .NET'te, tüm koleksiyon nesneleri arabirim altında gelir IEnumerableve bu da ArrayList(Index-Value))& karakterine sahiptir HashTable(Key-Value). .NET framework 2.0 sonra ArrayList& HashTableile değiştirilmiştir List& Dictionary. Artık, günümüz projelerinde Arraylist& HashTableartık kullanılmamaktadır.

HashTable& Dictionary, Arasındaki farka gelince Dictionaryjenerik Hastabledeğil jenerik. Herhangi bir nesne türünü ekleyebiliriz HashTable, ancak geri alırken onu gereken türe dökmemiz gerekir. Yani, tip güvenli değildir. Ancak dictionary, kendini bildirirken, anahtar ve değer türünü belirtebiliriz, bu nedenle geri alırken yayınlamaya gerek yoktur.

Bir örneğe bakalım:

HashTable

class HashTableProgram
{
    static void Main(string[] args)
    {
        Hashtable ht = new Hashtable();
        ht.Add(1, "One");
        ht.Add(2, "Two");
        ht.Add(3, "Three");
        foreach (DictionaryEntry de in ht)
        {
            int Key = (int)de.Key; //Casting
            string value = de.Value.ToString(); //Casting
            Console.WriteLine(Key + " " + value);
        }

    }
}

Sözlük,

class DictionaryProgram
{
    static void Main(string[] args)
    {
        Dictionary<int, string> dt = new Dictionary<int, string>();
        dt.Add(1, "One");
        dt.Add(2, "Two");
        dt.Add(3, "Three");
        foreach (KeyValuePair<int, String> kv in dt)
        {
            Console.WriteLine(kv.Key + " " + kv.Value);
        }
    }
}

2
KeyValuePair için veri türünü açıkça atamak yerine var. Bu, yazmayı azaltacaktır - foreach (var kv in dt) ... sadece bir öneri.
Ron

16

Sözlük:

  • Var olmayan bir anahtarı bulmaya çalışırsak İstisna döndürür / atar.

  • Bir Hashtable'dan daha hızlıdır, çünkü boks ve kutudan çıkarma yoktur.

  • Yalnızca genel statik üyeler iş parçacığı için güvenlidir.

  • Sözlük genel bir türdür, yani herhangi bir veri türüyle kullanabileceğimiz anlamına gelir (Oluştururken hem anahtarlar hem de değerler için veri türlerini belirtmelidir).

    Misal: Dictionary<string, string> <NameOfDictionaryVar> = new Dictionary<string, string>();

  • Dictionay, Hashtable'ın tür güvenli bir uygulamasıdır Keysve Valuesgüçlü bir şekilde yazılmıştır.

hashtable'a:

  • Var olmayan bir anahtarı bulmaya çalışırsak null değerini döndürür.

  • Boks ve kutu açma gerektirdiğinden sözlükten daha yavaştır.

  • Bir Hashtable'daki tüm üyeler iş parçacığı için güvenlidir,

  • Hashtable genel bir tür değildir,

  • Hashtable gevşek yazılan bir veri yapısıdır, her türden anahtar ve değer ekleyebiliriz.


"Var olmayan bir anahtarı bulmaya çalışırsak İstisna döndürür / atar." Dictionary.TryGetValue
Kullanırsanız

16

C # kullanarak Veri Yapıları kapsamlı Sınav MSDN makalesine bir fark da bulunmadığını bildiren çarpışma çözüm stratejisinin :

Hashtable sınıfı, rehashing olarak adlandırılan bir teknik kullanır .

Yeniden şekillendirme aşağıdaki gibi çalışır: H 1 ... H n hash farklı fonksiyonları vardır ve hash tablosuna bir öğe eklerken veya alırken, başlangıçta H 1 hash fonksiyonu kullanılır. Bir çarpışma için bu yönlendireceğini H ise 2 H itibaren yukarı yerine çalıştı ve n gerekirse.

Sözlük zincirleme olarak adlandırılan bir teknik kullanır .

Yeniden şekillendirme ile, bir çarpışma durumunda karma yeniden hesaplanır ve bir karma değerine karşılık gelen yeni yuva denenir. Ancak zincirleme ile, herhangi bir çarpışmayı tutmak için ikincil bir veri yapısı kullanılır . Özellikle, Sözlük'teki her alan, o gruba eşlenen bir dizi öğeye sahiptir. Bir çarpışma durumunda, çarpışma elemanı kova listesine eklenir.


16

.NET Framework 3.5'ten beri, yalnızca anahtarlara ihtiyacınız varsa ve değer içermiyorsa HashSet<T>tüm artılarını sağlayan bir de vardır Dictionary<TKey, TValue>.

Bu nedenle, a kullanırsanız Dictionary<MyType, object>ve her zaman değeri nullgüvenli karma tabloyu simüle etmek için olarak ayarlarsanız HashSet<T>,.


14

Bu Hashtablegevşek yazılan bir veri yapısıdır, böylece herhangi bir türdeki anahtarları ve değerleri ekleyebilirsiniz Hashtable. DictionarySınıf tip-güvenli Hashtableuygulama ve anahtarlar ve değerler yazdınız. Bir Dictionaryörnek oluştururken , hem anahtar hem de değer için veri türlerini belirtmeniz gerekir.


11

MSDN'nin "Sözlük <(Of <(TKey, TValue>)>) sınıfı HashTable olarak uygulanır" değil, "Sözlük <(Of <(TKey, TValue>)>) sınıfı karma tablo olarak uygulanır " ifadesine dikkat edin

Sözlük bir HashTable olarak UYGULANMAZ, ancak bir karma tablosu kavramının ardından uygulanır. Dahili Microsoft aynı kodu kullanmış ve Object türünün sembollerini TKey ve TValue ile değiştirmesine rağmen, uygulama Generics kullanımı nedeniyle HashTable sınıfıyla ilgisizdir.

.NET 1.0'da Generics yoktu; HashTable ve ArrayList başlangıçta burada başladı.


MSDN teklifini düzeltebilir misiniz? Bir şeyler eksik veya yanlış; dilbilgisi ve biraz anlaşılmaz değildir.
Peter Mortensen

10

HashTable:

Anahtar / değer, yığına kaydedilirken bir nesne (boks) türüne dönüştürülecektir.

Öbekten okurken anahtar / değer istenen türe dönüştürülmelidir.

Bu işlemler çok masraflıdır. Bokstan / kutudan çıkarmadan mümkün olduğunca kaçınmalıyız.

Sözlük: HashTable'ın genel varyantı.

Boks / kutudan çıkarma yok. Dönüşüm gerekmez.


8

Hashtable nesnesi, koleksiyonun öğelerini içeren bölümlerden oluşur. Bir kova, Hashtable içindeki sanal bir öğe alt grubudur; bu, arama ve almayı çoğu koleksiyonda olduğundan daha kolay ve hızlı hale getirir .

Dictionary sınıfı, Hashtable sınıfıyla aynı işlevselliğe sahiptir. Belirli bir türdeki (Nesne dışında) bir Sözlük, Hashtable'dan daha iyi performans gösterir değer türleri için çünkü Hashtable öğeleri Nesne türündedir ve bu nedenle, genellikle bir değer türü saklanır veya alınırsa boks ve kutudan çıkarma gerçekleşir.

Daha fazla okuma için: Hashtable ve Sözlük Koleksiyonu Türleri


7

Bir diğer önemli fark Hashtable'ın iş parçacığı için güvenli olmasıdır. Hashtable yerleşik çoklu okuyucu / tek yazar (MR / SW) iplik güvenliğine sahiptir, bu da Hashtable'ın ONE yazarına birden fazla okuyucu ile birlikte kilitlemeden izin vermesi anlamına gelir.

Sözlük söz konusu olduğunda iş parçacığı güvenliği yoktur; Eğer iplik güvenliğine ihtiyacınız varsa, kendi senkronizasyonunuzu uygulamalısınız.

Daha ayrıntılı olarak açıklamak için:

Hashtable, Synchronizedözellik boyunca iş parçacığı güvenliği sağlar , bu da koleksiyonun etrafında iş parçacığı için güvenli bir paket döndürür. Sargı, toplama veya çıkarma işlemlerinin tamamında tüm koleksiyonu kilitleyerek çalışır. Bu nedenle, koleksiyona erişmeye çalışan her iş parçacığı sırayla bir kilit almak için beklemek gerekir. Bu ölçeklenebilir değildir ve büyük koleksiyonlar için önemli performans düşüşüne neden olabilir. Ayrıca, tasarım yarış koşullarından tamamen korunmuyor.

List<T>, Dictionary<TKey, TValue>Vb. Gibi .NET Framework 2.0 toplama sınıfları hiçbir iş parçacığı eşitlemesi sağlamaz; eşzamanlı olarak birden çok iş parçacığına öğeler eklendiğinde veya kaldırıldığında kullanıcı kodu tüm senkronizasyonu sağlamalıdır

İş parçacığı güvenliğinin yanı sıra tür güvenliğine ihtiyacınız varsa, .NET Framework'te eşzamanlı koleksiyon sınıfları kullanın. Burada daha fazla okuma .

Ek bir fark, Sözlük'e birden çok giriş eklediğimizde, girişlerin eklenme sırasının korunmasıdır. Öğeleri Sözlük'ten aldığımızda kayıtları eklediğimiz sırayla alırız. Oysa Hashtable kampanya siparişini korumaz.


Anladığım kadarıyla, silme işlemlerini içermeyenHashset kullanım senaryolarında MR / SW iş parçacığı güvenliğini garanti eder . Bence tam olarak MR / SW güvenli olması düşünülmüş olabilir, ancak silme işlemlerini güvenli bir şekilde yapmak MR / SW güvenliği masrafını büyük ölçüde artırır. Tasarımı yaparken Dictionaryhiç silme senaryolarda minimum maliyetle MR / GB güvenliğini teklif var, MS "özel" olarak no-silme senaryoları tedavi önlemek istedi.
supercat

5

Anlayabileceğim bir fark daha:

Web servisleri ile Sözlük <KT, VT> (jenerikler) kullanamayız. Nedeni hiçbir web hizmeti standardının jenerik standardını desteklememesidir.


Sabun tabanlı web hizmetinde genel listeler (Liste <string>) kullanabiliriz. Ancak, bir web hizmetinde sözlük (veya hashtable) kullanamayız. Bunun nedeni .net xmlserializer'ın sözlük nesnesini işleyememesidir.
Siddharth

5

Dictionary<> genel bir türdür ve bu nedenle tür güvenlidir.

HashTable'a herhangi bir değer türü ekleyebilirsiniz ve bu bazen bir istisna oluşturabilir. Ancak Dictionary<int>yalnızca tamsayı değerlerini kabul eder ve benzer Dictionary<string>şekilde yalnızca dizeleri kabul eder.

Bu nedenle, Dictionary<>yerine kullanmak daha iyidir HashTable.


0

Çoğu programlama dilinde, sözlükler karma tablolara göre tercih edilir

Bunun mutlaka doğru olduğunu düşünmüyorum, çoğu dilin tercih ettikleri terminolojiye bağlı olarak bir veya diğeri var .

Bununla birlikte, C # 'da açık neden (benim için) C # HashTable'larının ve System.Collections ad alanının diğer üyelerinin büyük ölçüde geçersiz olmasıdır. Bunlar c # V1.1'de mevcuttu. C # 2.0 yerine System.Collections.Generic ad alanındaki Generic sınıfları ile değiştirildi.


Bir hashtable'ın sözlük üzerindeki avantajlarından biri, sözlükte bir anahtar yoksa bir hata atamasıdır. Bir hashtable içinde bir anahtar yoksa, sadece null değerini döndürür.
Bill Norman

C # hala ben jenerik avantajı yok gibi System.Collections.Hashtable kullanmaktan kaçınır. Anahtarın var olup olmadığını bilmiyorsanız Dictionary'nin TryGetValue veya HasKey komutunu kullanabilirsiniz.
kristianp

Hata, HasKey değil, ContainsKey olmalı.
kristianp

-3

.NET Reflector kullanarak gördüklerime göre :

[Serializable, ComVisible(true)]
public abstract class DictionaryBase : IDictionary, ICollection, IEnumerable
{
    // Fields
    private Hashtable hashtable;

    // Methods
    protected DictionaryBase();
    public void Clear();
.
.
.
}
Take note of these lines
// Fields
private Hashtable hashtable;

Dolayısıyla DictionaryBase'in dahili olarak bir HashTable kullandığından emin olabiliriz.


16
System.Collections.Generic.Dictionary <TKey, TValue>, DictionaryBase öğesinden türetilmemiştir.
snemarch

"Yani DictionaryBase dahili bir HashTable kullandığından emin olabilirsiniz." - Bu güzel, ama soru ile ilgisi yok.
Jim Balter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.