1. ホーム
  2. c#

[解決済み] lock(new object()) -- 貨物教団か、それともおかしな「言語の特殊性」?

2023-05-12 17:54:16

質問

私はコンサルタントによって書かれたいくつかのコードをレビューしています。何十もの赤旗がすでに現れている中、次のスニペットを理解することができません。

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# 言語の特別なケースなのでしょうか、それともプログラマーが単に、しばらく前にたまたま機能した貨物カルトを採用したのでしょうか?

どのように解決するのですか?

これを見た人がいてもおかしくはないですね。

private readonly object lockObj = new object();

private void MyMethod()
{
    lock(lockObj)
    {
        // do amazing stuff, so amazing it can only run once at a time
        // e.g. comands on the Mars Rover, or programs on iOS pre 4 / 5 ??
    }
}

と、行数を減らせると思ったのでしょう。

でも、もしそうだとしたら、とても心配ですね...。