verrouiller c # en utilisant des variables privées

selon Eric Gunnerson

Ne pas

  • Utilisez le verrou (this)
  • Utiliser le verrou (typeof ())

Ne verrouillez pas une variable privée, pas quelque chose que l’utilisateur puisse voir Utilisez «clé d’object = nouvel object ()» si vous avez besoin d’une clé privée pour le locking

quelle est la raison??

quelle est la raison??

Parce que tout ce qui n’est pas privé signifie que l’on pourrait utiliser de l’extérieur pour le verrouiller par quelqu’un d’autre ou tout code qui est en dehors de votre contrôle menant à des blocages.

La meilleure pratique consiste à verrouiller les variables statiques privées, comme ceci:

private static object _syncRoot = new object(); 

et alors:

 lock(_syncRoot) { ... } 

Les variables d’instance privées peuvent également être dangereuses, car l’instance de votre classe n’est pas quelque chose que vous, l’implémenteur de la classe, possédez. C’est le consommateur de la classe qui possède l’instance.

Vous devriez vraiment chercher de vieilles questions sur ceci avant d’en poster une nouvelle. Fermer à clé

Darin Dimitrov a également tort lorsqu’il dit que le locking des variables privées est dangereux. Les verrous sur les variables privées servent à synchroniser les ressources d’une instance particulière de votre classe. Cela peut arriver quand vous avez

 // A Client which listens to several servers public class Client { private static object logSync = new object(); private readonly Dictionary servers = new Dictionary();// .... some code for initialization ... // Disposing a server. public void Dispose (ssortingng serverName) { // the lock needed here is on private variable. This purpose cannot be achieved with a // lock on private static object. Well you can achieve the purpose but you will block // all Client instances when you do so, which is pointless. // Also notice that services is readonly, which is convenient // because that is the object we took a lock on. The lock is on the same object always // there is no need to unnecessarily create objects for locks. lock(services) { // ... Do something cleanup here ... Server server; if (servers.TryGetValue(serverName, out server)) { server.Dispose(); servers.Remove(serverName); } } } // on some message that has to be logged public void OnMessage(ssortingng message, Server server) { // This makes sure that all clients log to the same sink and // the messages are processed in the order of receipt lock (logSync) { Log(evt); } } 

}