Я переглядаю якийсь код, написаний консультантом, і хоча десятки червоних прапорів уже з’явилися, я не можу обернути голову навколо такого фрагмента:
private void foo()
{
if (InvokeRequired)
{
lock (new object())
{
if (m_bar!= null)
Invoke(new fooDelegate(foo), new object[] { });
}
}
else
{
if(OnBazChanged != null)
OnBazChanged();
}
}
Що тут робить lock (new object ())? Це не повинно мати жодного ефекту, оскільки воно завжди блокується на інший об’єкт, але такий тип блокування постійний у всьому коді, навіть у частинах, які не копіюються та вставляються. Це якийсь особливий випадок у мові C #, який компілюється до чогось, про що я не знаю, чи програміст просто прийняв якийсь культ вантажу, який спрацював деякий час тому?
new object()
зберігалося в полі, і це поле використовувалось уlock()
висловлюваннях, і вони не знали, що краще не вбудовувати його.