ج#:الفرق بين القائمة<T> والمجموعة<T> (CA1002، لا تعرض القوائم العامة) [نسخة مكررة]

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

  •  22-07-2019
  •  | 
  •  

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

حاولت تشغيل تحليل الكود في مشروع هنا، وحصلت على عدد من التحذيرات التي تقول شيئًا مثل هذا:

CA1002 :مايكروسوفت. التصميم :تغيير "القائمة"<بعض الانواع>'في'SomeClass.SomeProtectedOrPublicPropertyلاستخدام Collection أو ReadOnlyCollection أو KeyedCollection

لماذا يجب أن أستخدم Collection<T> بدلاً من List<T>؟عندما أنظر إلى وثائق msdn، تبدو متساوية تقريبًا.بعد قراءة تعليمات الخطأ الخاصة بالتحذير، وجدت ذلك

System.Collections.Generic.List(T)_هي مجموعة عامة مصممة للأداء وليس للوراثة، وبالتالي لا تحتوي على أي أعضاء افتراضيين.

لكن ماذا يعني هذا حقا؟وماذا يجب أن أفعل بدلا من ذلك؟

هل يجب أن أستمر في الاستخدام List<T> داخليا، ثم في خصائص العودة أ new Collection<T>(someList) بدلاً من؟أم يجب أن أبدأ في الاستخدام Collection<T> بدلاً من List<T>?

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

المحلول

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

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

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

نصائح أخرى

Collection يعرض بعض الأعضاء الظاهريين (إدراج، إزالة، تعيين، مسح) الذين يمكنك تجاوزهم وتوفير وظائف إضافية (مثل أحداث الإعلام) عند تغيير المجموعة.

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

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

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