18

C# でイベントを作成するときは、.NET Framework ガイドライン の例から次のように定義するのが一般的です。

public class CustomEventArgs : EventArgs
{
    public CustomEventArgs(string s)
    {
        msg = s;
    }
    private string msg;
    public string Message
    {
        get { return msg; }
    } 
}

...

public delegate void CustomEventHandler(object sender, CustomEventArgs a);

多くの場合、引数をまったく必要としないイベントを作成します。Action私は通常、イベント ハンドラー タイプを使用して単純にこれを実装します。

public event Action LogonScreenExited;

「伝統的な」パターンに従いたい理由があるのか​​ どうか疑問に思っていました. おそらく、このようなイベントは設計上の欠陥を示しているのでしょうか? ただし、使用する理由ActionYAGNIです。使用されていないときに何かを実装する (そしてその意図を示す) のはなぜですか?

4

3 に答える 3

17

これは要件ではなく、単なる設計ガイドです。

クライアント コードがイベントをどのように使用するかを予測することはできず、将来も予測できないことに留意する必要があります。複数のイベント ソースからのイベントを処理する単一のイベント ハンドラ メソッドを使用できるようにするため、sender引数はクライアント プログラマにとって便利です。EventArgs からの派生は、クライアント コードを壊すことなく、元の基本クラスから派生させ、追加の引数を追加して、イベントをリファクタリングできるため便利です。このアプローチの利点を無視してもかまいません。

于 2013-09-08T19:18:05.880 に答える
9

デリゲート の反変性を利用して、一般的なイベント ハンドラーを作成し、さまざまな種類のイベント (ログ機能など) に使用できるためです。

msdn の例を次に示します。

// Event hander that accepts a parameter of the EventArgs type. 
private void MultiHandler(object sender, System.EventArgs e)
{
    label1.Text = System.DateTime.Now.ToString();
}

public Form1()
{
    InitializeComponent();

    // You can use a method that has an EventArgs parameter, 
    // although the event expects the KeyEventArgs parameter. 
    this.button1.KeyDown += this.MultiHandler;

    // You can use the same method  
    // for an event that expects the MouseEventArgs parameter. 
    this.button1.MouseClick += this.MultiHandler;

}

これ以外は、設計ガイドであり、推奨される方法です。これに従うことで、コードを保守しやすくなり、.NET の残りの部分と一貫性を保つことができるため、クラスを使用する多くの人に役立ちます。

于 2013-09-08T19:16:38.270 に答える