1. ホーム
  2. c#

[解決済み] C#でnullでない場合のメソッド呼び出し

2022-07-28 13:19:34

質問

この文章を何とか短くできないでしょうか?

if (obj != null)
    obj.SomeMethod();

というのは、たまたまこれを書くことが多くて、かなりめんどくさくなってしまうからです。唯一思いつくのは、実装として Nullオブジェクト パターンを実装することくらいしか思いつきませんが、それは毎回できることではありませんし、構文を短くするための解決策でないことは確かです。

また、イベントでも同様の問題があり、ここでは

public event Func<string> MyEvent;

を実行し

if (MyEvent != null)
    MyEvent.Invoke();

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

C# 6 以降は、そのまま使えます。

MyEvent?.Invoke();

または

obj?.SomeMethod();

?. はnull-propagating演算子であり、これにより .Invoke() を短絡させ、オペランドが null . オペランドは一度しかアクセスされないので、quot;check と invoke" の間で値が変わるという問題が発生する危険はありません。

===

C# 6 より前のバージョンでは、NULL-SAFE のマジックはありません。

public static void SafeInvoke(this Action action) {
    if(action != null) action();
}

はこれで有効です。

Action act = null;
act.SafeInvoke(); // does nothing
act = delegate {Console.WriteLine("hi");}
act.SafeInvoke(); // writes "hi"

イベントの場合、これはレースコンディションを取り除くという利点もあります。つまり、一時的な変数が不要になるのです。つまり、通常は

var handler = SomeEvent;
if(handler != null) handler(this, EventArgs.Empty);

を持つが

public static void SafeInvoke(this EventHandler handler, object sender) {
    if(handler != null) handler(sender, EventArgs.Empty);
}

はシンプルに使うことができます。

SomeEvent.SafeInvoke(this); // no race condition, no null risk