19

ジェネリックでは、特定の派生 EventArg クラスを作成する理由はありますか

今では、一般的な実装でオンザフライで簡単に使用できるようです。

すべての例を調べて、eventArg クラス (StringEventArgs、MyFooEventArgs など) を削除する必要があります。

public class EventArgs<T> : EventArgs
{
    public EventArgs(T value)
    {
        m_value = value;
    }

    private T m_value;

    public T Value
    {
        get { return m_value; }
    }
}
4

4 に答える 4

38

あなたが説明しているのは、本質的にtuples、特定の目的に使用されるグループ化された値です。それらは関数型プログラミングの有用な構成要素であり、そのスタイルを非常によくサポートします。

欠点は、それらの値に名前が付けられておらず、理解するためにコンテキストが必要なことです。EventArgsその性質上、関連するコンテキストから遠く離れて消費されることがよくあります。したがって、タプル風EventArgsは消費者にとって非常に混乱する可能性があります。

何らかの除算が完了したことを示すイベントがあり、分子、分母、および結果が含まれているとします。

public event EventHandler<EventArgs<double, double, double>> Divided;

イベント ハンドラーにはあいまいな点があります。

private void OnDivided(object sender, EventArgs<double, double, double> e)
{
    // I have to just "know" this - it is a convention

    var numerator = e.Value1;
    var denominator = e.Value2;
    var result = e.Value3;
}

EventArgsこれは、イベントを表すとより明確になります。

private void OnDivided(object sender, DividedEventArgs e)
{
    var numerator = e.Numerator;
    var denominator = e.Denominator;
    var result = e.Result;
}

ジェネリックな再利用可能なEventArgsクラスは、意図を表現することを犠牲にしてメカニズムの開発を容易にします。

于 2008-11-22T18:25:50.493 に答える
3

Matthew Cochranによって書かれたCustom Generic EventArgsの記事を見てください。その記事では、2 つおよび 3 つのメンバーでさらに拡張する方法について説明しています。

ジェネリック EventArgs を使用すると、その過程で型情報が失われるため、用途があり、もちろん誤用もあります。

public class City {...}

public delegate void FireNuclearMissile(object sender, EventArgs<City> args);
public event FireNuclearMissile FireNuclearMissileEvent;

public delegate void QueryPopulation(object sender, EventArgs<City> args);
public event QueryPopulation QueryPopulationEvent;

次の例では、タイプ セーフですが、もう少し LOC です。

class City {...}

public class FireNuclearMissileEventArgs : EventArgs
{
    public FireNuclearMissileEventArgs(City city)
    {
        this.city = city;
    }

    private City city;

    public City City
    {
        get { return this.city; }
    }
}

public delegate void FireNuclearMissile(object sender, FireNuclearMissileEventArgs args);
public event FireNuclearMissile FireNuclearMissileEvent;

public class QueryPopulationEventArgs : EventArgs
{
    public QueryPopulationEventArgs(City city)
    {
        this.city = city;
    }

    private City city;

    public City City
    {
        get { return this.city; }
    }
}

public delegate void QueryPopulation(object sender, QueryPopulationEventArgs args);
public event QueryPopulation QueryPopulationEvent;
于 2008-11-22T17:00:19.183 に答える
0

TcKs が既に述べたように:EventArgs<T>値を 1 つだけ渡す必要がある場合に使用し、それ以外の場合はEventArgs(またはEventArgs<T>、必要なものから) 派生します。

于 2008-11-22T15:43:46.623 に答える