J'examine du code écrit par un consultant, et bien que des dizaines de signaux d'alarme soient déjà apparus, je ne peux pas comprendre l'extrait de code suivant:
private void foo()
{
if (InvokeRequired)
{
lock (new object())
{
if (m_bar!= null)
Invoke(new fooDelegate(foo), new object[] { });
}
}
else
{
if(OnBazChanged != null)
OnBazChanged();
}
}
Que fait lock (new object ()) ici? Ne devrait avoir aucun effet car il se verrouille toujours sur un autre objet, mais ce type de verrouillage est persistant dans tout le code, même dans les parties non copiées-collées. Est-ce un cas particulier dans le langage C # qui est compilé vers quelque chose que je ne connais pas, ou le programmeur a-t-il simplement adopté un culte du cargo qui fonctionnait il y a quelque temps?
new object()
était stocké dans un champ, et ce champ était utilisé dans leslock()
déclarations, et ils ne savaient pas qu'il valait mieux ne pas le mettre en ligne.