uso c# generics dictionary hashtable

uso - hashtable vs dictionary c#



Hashtable a Dictionary<> syncroot. (4)

El nuevo pensamiento detrás de SyncRoot es que fue un error en el diseño original. Si lo único que desea bloquear es el diccionario y es privado, puede bloquearlo u otro objeto que sirva como objeto de sincronización. La última técnica es útil cuando el estado que está protegiendo es más que solo el diccionario.

// used as you would have used SyncRoot before object _syncLock = new object(); Dictionary<string, int> numberMapper = new Dictionary<string, int>(); // in some method... lock (_syncLock) { // use the dictionary here. }

Las tablas hash tienen una propiedad syncroot pero los diccionarios genéricos no. Si tengo un código que hace esto:

lock (hashtable.Syncroot) { .... }

¿Cómo replico esto si elimino la tabla hash y cambio a diccionarios genéricos?


Si el hashtable / dictionary no es público, puede bloquear el objeto del diccionario.


Si va estrictamente por compatibilidad, Bryan tiene razón. Esta es la mejor manera de mantener su semántica actual sobre un diccionario.

Sin embargo, expandiéndolo. La razón por la que la propiedad SyncRoot no se agregó directamente al diccionario genérico es que es una forma peligrosa de realizar la sincronización. Es ligeramente mejor que "bloquear (esto)", que es muy peligroso y propenso a bloqueos. Aquí hay un par de enlaces que explican por qué esto es malo.


var dictionary = new Dictionary<int, string>(); lock(((ICollection) dictionary).SyncRoot) { // ... }