هي الطبقات EventArg المطلوب الآن أن لدينا الأدوية

StackOverflow https://stackoverflow.com/questions/311432

  •  10-07-2019
  •  | 
  •  

سؤال

ومع الأدوية، وهناك من أي وقت مضى سببا لخلق محددة مستمدة الطبقات 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; }
    }
}
هل كانت مفيدة؟

المحلول

ما كنت تصف هي أساسا الصفوف والقيم تجميع تستخدم لغرض معين. فهي مفيدة في بناء البرمجة الوظيفية ودعم هذا النمط بشكل جيد للغاية.

والجانب السلبي هو أن قيمهم ليست مسمى، وأنها تتطلب السياق إلى أن يفهم. EventArgs بطبيعتها وغالبا ما تستهلك بعيدا عن سياقها ذات الصلة. لذلك، يمكن-الصفوف (tuple) سقو 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 قابلة لإعادة الاستخدام سهولة تطوير آلية على حساب التعبير عن النوايا.

نصائح أخرى

ونظرة على المادة عام مخصص EventArgs كتبه ماثيو كوكران ، في هذا المقال يصف كيفية توسيعه أبعد من ذلك مع اثنين وثلاثة أعضاء.

وعن طريق 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;

وكما قال TcKs بالفعل: استخدام EventArgs<T> إذا كنت بحاجة فقط لتمرير قيمة واحدة، وإلا تنبع من EventArgs (أو EventArgs<T>، كل ما تريد)

.

وأعتقد EventArgs على غرار الصفوف (tuple) مفيدة. تماما مثل الصفوف (tuple)، ويمكن أن يساء استخدامها، ولكن يبدو لي الكسل هو أقوى أن إحساسي الحذر. I تنفيذ ما يلي:

public static class TupleEventArgs
{
    static public TupleEventArgs<T1> Create<T1>(T1 item1)
    {
        return new TupleEventArgs<T1>(item1);
    }

    static public TupleEventArgs<T1, T2> Create<T1, T2>(T1 item1, T2 item2)
    {
        return new TupleEventArgs<T1, T2>(item1, item2);
    }

    static public TupleEventArgs<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3)
    {
        return new TupleEventArgs<T1, T2, T3>(item1, item2, item3);
    }
}

public class TupleEventArgs<T1> : EventArgs
{
    public T1 Item1;

    public TupleEventArgs(T1 item1)
    {
        Item1 = item1;
    }
}

public class TupleEventArgs<T1, T2> : EventArgs
{
    public T1 Item1;
    public T2 Item2;

    public TupleEventArgs(T1 item1, T2 item2)
    {
        Item1 = item1;
        Item2 = item2;
    }
}

public class TupleEventArgs<T1, T2, T3> : EventArgs
{
    public T1 Item1;
    public T2 Item2;
    public T3 Item3;

    public TupleEventArgs(T1 item1, T2 item2, T3 item3)
    {
        Item1 = item1;
        Item2 = item2;
        Item3 = item3;
    }
}

ويمكن استخدامها على النحو التالي (عند استخدامها مع الحدث تمديد جامع )

public event EventHandler<TupleEventArgs<string,string,string>> NewEvent;

NewEvent.Raise(this, TupleEventArgs.Create("1", "2", "3"));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top