سؤال

هذا من الواضح أنه لا يبدو أنها لن تكون أفضل الممارسات.هل يمكن لأي شخص أن يشرح لماذا لا تعتبر هذه الممارسة من أفضل الممارسات أو كيف يعمل هذا؟سيكون موضع تقدير أي كتب أو مقالات تقدم شرحا.

//The constructor
public Page_Index() {

    //create a local value
    string currentValue = "This is the FIRST value";

    //use the local variable in a delegate that fires later
    this.Load += delegate(object sender, EventArgs e) {
        Response.Write(currentValue);
    };

    //change it again
    currentValue = "This is the MODIFIED value";

}

القيمة التي يتم إخراجها هي القيمة الثانية "معدل".أي جزء من سحر المترجم يجعل هذا العمل؟هل الأمر بهذه البساطة مثل تتبع القيمة الموجودة في الكومة واستعادتها مرة أخرى لاحقًا؟

[يحرر]:نظرا لبعض التعليقات، تغيير الجملة الأصلية بعض ...

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

المحلول

لم تعد القيمة الحالية متغيرًا محليًا:إنها تم الاستيلاء عليها عامل.هذا يجمع إلى شيء مثل:

class Foo {
  public string currentValue; // yes, it is a field

  public void SomeMethod(object sender, EventArgs e) {
    Response.Write(currentValue);
  }
}
...
public Page_Index() {
  Foo foo = new Foo();
  foo.currentValue = "This is the FIRST value";
  this.Load += foo.SomeMethod;

  foo.currentValue = "This is the MODIFIED value";
}

لدى جون سكيت كتابة جيدة حقًا عن هذا C # في العمق, ، ومناقشة منفصلة (ليست مفصلة). هنا.

لاحظ أن المتغير currentValue موجود الآن في الكومة، وليس في المكدس - وهذا له الكثير من الآثار، ليس أقلها أنه يمكن الآن استخدامه من قبل العديد من المتصلين.

هذا يختلف عن جافا:في جافا قيمة يتم التقاط المتغير.في لغة C#، المتغير نفسه إلتقطت أو تلتقط.

نصائح أخرى

أفترض أن السؤال الأكثر طرحه هو كيف يعمل مع متغير محلي [MG EDIT:تمت إضافة "Ack - تجاهل هذا..." بعد ذلك]

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

وللحصول على معلومات، إعادة "ليست ممارسة جيدة" - فالطرق المجهولة والمتغيرات الملتقطة هي في الواقع أداة قوية بشكل لا يصدق، خصوصاً عند العمل مع الأحداث.لا تتردد في استخدامها، ولكن إذا كنت تسلك هذا الطريق، فإنني أوصي بالتقاط كتاب جون للتأكد من أنك تفهم ما يحدث بالفعل.

تحتاج إلى التقاط قيمة المتغير داخل الإغلاق/التفويض، وإلا يمكن تعديله، كما رأيت.

قم بتعيين القيمة الحالية لمتغير محلي (داخلي) للمفوض.

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