Przeglądam kod napisany przez konsultanta i chociaż pojawiły się już dziesiątki czerwonych flag, nie mogę otoczyć głowy następującym fragmentem:
private void foo()
{
if (InvokeRequired)
{
lock (new object())
{
if (m_bar!= null)
Invoke(new fooDelegate(foo), new object[] { });
}
}
else
{
if(OnBazChanged != null)
OnBazChanged();
}
}
Co tu robi lock (new object ())? Nie powinno mieć żadnego efektu, ponieważ zawsze blokuje inny obiekt, ale ten rodzaj blokowania jest trwały w całym kodzie, nawet w częściach, które nie są kopiowane i wklejane. Czy jest to jakiś szczególny przypadek w języku C #, który jest skompilowany do czegoś, o czym nie wiem, czy też programista po prostu przyjął jakiś kult cargo, który działał jakiś czas temu?
new object()
był przechowywany w polu, a to pole było używane wlock()
wyciągach, i nie wiedzieli lepiej, aby go nie wstawiać.