سؤال

مجرد سؤال عام حول أفضل الممارسات:

public void Foo()
{
    int x = 5;
    myControl.Click += (o, e) =>
    {
        x = 6;
    };
}

إشعار ، أنا أستخدم x متغير داخل معالج حدث Lambda الخاص بي.

أو:

public class Bar
{
    private int x = 5;
    public void Foo()
    {
        Control myControl = new Control();
        myControl.Click += new EventHandler(myControl_Click);
    }

    private void myControl_Click(object sender, EventArgs e)
    {
        x = 6;
    }
}

هنا، x هو عضو خاص في الفصل ، وبالتالي لدي إمكانية الوصول إليه في معالج الأحداث الخاص بي.

الآن دعنا نقول أنني لست بحاجة x في أي مكان آخر في الكود (لأي سبب من الأسباب) ، ما هي الطريقة الأفضل للذهاب؟

هل كانت مفيدة؟

المحلول

ذلك يعتمد على حاجتك. في المثال الأول ، تقتصر الآثار الجانبية لمعالج الحدث الخاص بك على نطاق الطريقة ، وفي الثانية ، يتم تحديد التأثيرات الجانبية. أعتقد أن استخدام الإغلاق من حيث مثالك الأول لا يخدم أي غرض نظرًا لأن X لا يتم استخدامه في أي مكان ، لذلك من الصعب تحديده بناءً على الأمثلة الخاصة بك.

ومع ذلك ، من الأفضل عمومًا علاج معالجات الأحداث (التي تنشئها في الكود) كما تفعل مع المتغيرات. نطاقهم بأكبر قدر ممكن ، وإعادة تجديدهم إلى نطاق أوسع حسب الحاجة.

مثال أفضل يبرز عندما تكون ينبغي استخدام الإغلاق على النحو التالي:

public void Subscribe(Action<string> messageCallBack)
{
    myButton.Click += () => messageCallBack("Button was clicked.");
}

هذا يسمح لمشتركين متعددين ، وهو أبسط بكثير من البديل:

private readonly List<Action<string>> callBacks;
public MyClass()
{
    callBacks = new List<Action<string>>();
    myButton.Click += myButton_Click;
}

private myButton_Click(object sender, EventArgs e)
{
    foreach (Action<string> callBack in callBacks)
    {
        callBack("Button was clicked");
    }
}

public void Subscribe(Action<string> messageCallBack)
{
    callBacks.Add(messageCallBack);
}

نصائح أخرى

إذا لم تكن بحاجة إلى X في أي مكان آخر في الكود ، فإن معالجك هو أمر لا يوجد - لذلك هذا بالتأكيد وضع هراء.

بمجرد فعل تحتاج إلى x ، تحتاج إلى أن تقرر ما إذا كان ينبغي تحديد موقعه على مثيل الشريط أو مثيل المندوب (أو ربما بعض مجموعة من المندوبين) ، وهذا سوف يملي ما تفعله.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top