0

System.EventArgs は、null オブジェクト パターンのバリアントを実装します。開発者は、null の代わりに EventArgs.Empty を使用して、"ここには何も意味がない" 状況を指定します。

派生イベント引数クラスを使用して独自のイベントを宣言していContosoEventArgs ます。消費者が次のようなものを渡すことができるのは当然だと思いますContosoEventArgs.Empty(EventArgs.Emptyこれは基本クラスのインスタンスを割り当てようとするため、機能しません)派生クラスの変数に)、慣れているように。ただし、これは実装が難しいです。Empty 静的プロパティは、派生クラスで設定できる保護されたプロパティ IsEmpty に依存していません。もしそうなら、私は次のようなことができます:

public class ContosoEventArgs : EventArgs
{
    public static ContosoEventArgs Empty
    {
        get
        {
            return new ContosoEventArgs{IsEmpty=true};
        }
    }
}

素敵できれい!

ただし、そのようなプロパティは存在せず、私の知る限り、EventArgs インスタンスの空さをテストする唯一の方法は、EventArgs.Empty と比較することです。これは、特殊なイベント引数をベース EventArgs

代わりに null を許可する必要がありますか? フレームワーク自体で彼らが行ったことはほとんど同じだと思います-MouseEventArgsとImageClickEventArgsはnullオブジェクトパターン実装の痕跡を示しません

それとも、3番目のオプションを見落としていますか?

4

1 に答える 1

1

等価メンバーをオーバーロードせずにこのコードを使用できると思います。

public class ContosoEventArgs : EventArgs
{
    public new static readonly ContosoEventArgs Empty = new ContosoEventArgs();
}

EventArgs を見ると、静的インスタンスを使用して比較しています。

 [ComVisible(true)]
[__DynamicallyInvokable]
[Serializable]
public class EventArgs
{
    [__DynamicallyInvokable]
    public static readonly EventArgs Empty = new EventArgs();

    static EventArgs()
    {
    }
    [__DynamicallyInvokable]
    [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    public EventArgs()
    {
    }
}
于 2013-04-16T14:11:29.407 に答える