2009-01-03 8 views

Répondre

4

Oui, le moniteur est pris sur un objet différent dans chaque, donc les deux ne sont pas équivalents fonctionnels . Le SyncRoot est exposé afin que vous puissiez le verrouiller pour l'accès des membres de la collection (et la collection utilise en interne la même chose pour le verrouillage). Cela permet au code de la collection et au code externe de convenir d'un objet verrou spécifique.

0

Cela dépend de l'implémentation de l'IDictionary. Si le dictionnaire renvoie "this" comme SyncRoot, les instructions sont équivalentes.

0

Il est vraiment facile de voir comment il est pas le même:

Monitor.Enter((IDictionary) _collection).SyncRoot)); 
Monitor.Exit(_collection); 

Ce sera probablement lancer une exception disant que l'objet n'est pas la même chose.

Je recommanderais d'utiliser l'objet SyncRoot. L'IDictionary peut simplement retourner this et il sera effectivement le même, mais ce n'est pas garanti.

+0

Que voulez-vous dire "peut" être le même. Si l'implémentation est Dictionary leora

+0

je l'ai dit dans ma réponse. "L'IDictionary peut simplement retourner ceci et il sera effectivement le même, mais ce n'est pas garanti." –

4

Je crois qu'il y a deux questions.

Est-ce la même chose?

La réponse à cette question est "ça dépend". C'est la même chose si SyncRoot est implémenté en retenant "ceci". IDictionary est une interface et aucun contrat ne précise quel objet doit être retourné pour la propriété SyncRoot. L'implémenteur est libre de retourner "ceci" ou un objet complètement différent (IDictionary < TKey, TValue > fait cela).

Est-ce une bonne idée?

n ° implémenteurs IDictionary ont tendance à retourner un objet différent (tous les clasess de collecte standard ne). Donc, les chances sont contre vous dans la création d'une construction de verrouillage valide.