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




.net enumeration (7)

أي تنفيذ IEnumerable<T> يجب أن يعود فئة. قد يكون من المفيد لأسباب تتعلق بالأداء أن يكون لديك أسلوب GetEnumerator الذي يقوم بإرجاع بنية توفر الأساليب اللازمة للعد ولكن لا تنفذ IEnumerator<T> ؛ يجب أن تكون هذه الطريقة مختلفة عن IEnumerable<T>.GetEnumerator ، والتي ينبغي بعد ذلك تنفيذها بشكل صريح.

استخدام هذا النهج سيسمح للأداء المعزز عندما يتم تعداد الصف باستخدام حلقة فوريش أو "لكل" في C # أو vb.net أو أي سياق حيث التعليمات البرمجية التي تقوم بالعد سوف نعرف أن العداد هو بنية، ولكن تجنب والمزالق التي من شأنها أن تحدث خلاف ذلك عندما يحصل على العداد محاصر ومرت من القيمة.

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

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


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

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


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

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

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


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


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

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


كتابة ذلك باستخدام yield return .

أما لماذا يمكنك اختيار خلاف ذلك بين class أو struct ، إذا كنت جعله struct ثم يحصل على مربع بمجرد إعادته كواجهة، لذلك جعلها struct فقط يسبب نسخ إضافية أن تأخذ مكان. لا يمكن أن نرى نقطة من ذلك!


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

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

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





struct-vs-class