c# - إنوميراتور التنفيذ: استخدام هيكل أو فئة؟




.net enumeration (6)

لقد لاحظت أن List<T> تعرف struct ، في حين أن ArrayList تعرف ArrayList class . ماهو الفرق؟ إذا كان لي أن أكتب عددا لفئتي، أي واحد سيكون من الأفضل؟

تحرير: متطلبات بلدي لا يمكن الوفاء بها باستخدام yield ، لذلك أنا تنفيذ العداد من بلدي. ومع ذلك، أتساءل عما إذا كان من الأفضل اتباع خطوط List<T> وتنفيذها كهيكل.


أسهل طريقة لكتابة العداد في C # هو مع نمط "العائد العائد". فمثلا.

public IEnumerator<int> Example() {
  yield return 1;
  yield return 2;
}

هذا النمط سوف تولد كل من رمز العداد تحت غطاء محرك السيارة. هذا يأخذ القرار من يديك.


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

في رأيي، يجب أن تكون الهياكل غير قابلة للتغيير، لذلك أود أن استخدام فئة.


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


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

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


مثل هذا الآخرين، وأود أن تختار فئة. الهياكل القابلة للتغيير سيئة. (وكما يوحي جاريد، يمكنني استخدام كتلة متكررة، ومن ناحية الترميز العداد هو فيدلي للحصول على الحق.)

راجع مؤشر الترابط هذا للحصول على مثال لعداد القائمة كونه بنية قابلة للتحويل تسبب مشكلات ...


للتوسيع علىEarwicker: كنت عادة أفضل من عدم كتابة نوع العداد، وبدلا من ذلك استخدام yield return إلى أن المترجم يكتب لك. هذا لأن هناك عدد من المهمات الهامة التي قد تفوت إذا كنت تفعل ذلك بنفسك.

راجع السؤال سو " ما هي الكلمة الرئيسية للنتائج المستخدمة في C #؟ " للحصول على مزيد من التفاصيل حول كيفية استخدامها.

أيضا ريموند تشن لديه سلسلة من بلوق وظيفة (" تنفيذ التكرارات في C # وعواقبه ": الأجزاء 1 و 2 و 3 و 4 ) التي تظهر لك كيفية تنفيذ التكرار بشكل صحيح دون yield return ، مما يدل على مدى تعقيدا فقط هو، ولماذا يجب عليك فقط استخدام yield return .







struct-vs-class