5

がを取得するのを避けるためでActionはないかどうかを確認する必要があるのはなぜですか? アクションがなければ、何もせずにそのままでいいのではないか。なぜ例外をスローする必要があるのか​​ わかりません。はクラスですが、なぜこれ自体を処理しないのですか?nullNullReferenceExceptionAction

4

3 に答える 3

17

Invokeオブジェクトでインスタンス メソッド ( ) を呼び出そうとしています。参照を使用している場合、それを行うと常に失敗します1。例えば:NullReferenceExceptionnull

 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 参照を非仮想的に「オン」にしてインスタンス メソッドを呼び出す方法はありますが、通常とはかけ離れています。

于 2013-09-11T13:04:19.747 に答える
14

C# 6.0 以降では、次のことができます。

myAction?.Invoke();

拡張メソッドは必要ありません。

于 2016-02-09T11:01:17.517 に答える
8

Actionクラスではなくデリゲートです。アクションを呼び出すと、次のようになります。

myAction();

ここで実際に起こっていることは次のとおりです。

myAction.Invoke();

インスタンスを呼び出しているmyAction場合、これは自然に を発生させます。nullInvokenullNullReferenceException

于 2013-09-11T13:01:04.493 に答える