がを取得するのを避けるためでAction
はないかどうかを確認する必要があるのはなぜですか? アクションがなければ、何もせずにそのままでいいのではないか。なぜ例外をスローする必要があるのか わかりません。はクラスですが、なぜこれ自体を処理しないのですか?null
NullReferenceException
Action
3 に答える
Invoke
オブジェクトでインスタンス メソッド ( ) を呼び出そうとしています。参照を使用している場合、それを行うと常に失敗します1。例えば:NullReferenceException
null
object x = null;
string y = x.ToString();
object.ToString()
それも処理する必要がありますか?
基本的に、これは型システムの残りの部分が機能する方法と一致しています。C# 言語は別の方法で設計できaction()
た可能性があります (意味の「簡略化」のためだけである可能性action.Invoke()
があります)。しかし、そうではありませんでした。
Action
必要に応じて、独自の拡張メソッドを簡単に追加できます。
public static class ActionExtensions
{
public static void NullSafeInvoke(this Action action)
{
if (action != null)
{
action();
}
}
}
または、C# 6 のnull 条件演算子を使用して、参照が null 以外の場合にのみデリゲートを呼び出します。
myAction?.Invoke();
(これは、アクションだけでなく、任意のデリゲート タイプで機能します。EventHandler
たとえば、 のようなものを使用します。が nullの場合、コンストラクターは呼び出されません。)handler?.Invoke(this, new EventArgs())
EventArgs()
handler
1少なくとも C# を使用します。IL で null 参照を非仮想的に「オン」にしてインスタンス メソッドを呼び出す方法はありますが、通常とはかけ離れています。
C# 6.0 以降では、次のことができます。
myAction?.Invoke();
拡張メソッドは必要ありません。
Action
クラスではなくデリゲートです。アクションを呼び出すと、次のようになります。
myAction();
ここで実際に起こっていることは次のとおりです。
myAction.Invoke();
インスタンスを呼び出しているmyAction
場合、これは自然に を発生させます。null
Invoke
null
NullReferenceException