عند تسلسل مندوبي .NET، كيف يتم (إعادة) استخدام المثيلات الأصلية؟

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

سؤال

لنفترض أن لدي رمز C# التالي:

Action a = TestMethod;
Action b = TestMethod;
Action c = b;
b += a;

الاختبارات تشير إلى ذلك b ليس هو نفس المثال c, ، ومن الواضح أن + يبدو أن عامل التشغيل يقوم بإنشاء مثيل جديد للمفوض.هل هذا الافتراض صحيحا؟هل يعيد استخدام b-المثيل داخليًا، أم أنه يقوم فقط بنسخ معلومات الطريقة/الهدف إلى مثيل جديد؟

يبدو أنني غير قادر على العثور على تنفيذ + مشغل للمفوضين، يبدو أن فئة المندوب لا تحتوي عليه.

يمكن لأي شخص أن يلقي بعض الضوء على هذه القضية؟

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

لاحظ أن هذا هو رمز داخلي بالكامل لمكتبتي، لذلك بينما أعلم أن تمرير هياكل البيانات الداخلية مثل هذه فكرة سيئة بشكل عام، إذا كان بإمكاني القيام بذلك بأمان مع هذه الفئات، فسوف أفعل ذلك.

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

المحلول

كما يقول كينت، += يستخدم ل Delegate.Combine, و-= الاستخدامات Delegate.Remove.انظر بلدي الأحداث / المندوبين المادة للمزيد من المعلومات.

الشيء المهم هو أن المفوضين غير قابلين للتغيير - استدعاء الجمع/الإزالة لا يغير المفوض الذي تتصل به على الإطلاق - لذلك لا تحتاج إلى استنساخ أي شيء.وينطبق الشيء نفسه على أي شيء آخر تفعله مع المندوب:إذا حصلت على قائمة الاستدعاءات وقمت بتغيير محتويات المصفوفة التي تم إرجاعها، على سبيل المثال، فلن يغير ذلك ما يفعله المفوض بالفعل.

(هذا يشبه سلوك String تمامًا، إذا كنت تريد طريقة أخرى للتفكير فيه.)

نصائح أخرى

و+= ما يعادل Delegate.Combine(). -= ما يعادل Delegate.Remove(). كل بإنشاء مثيل Delegate جديد ويعود ذلك.

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