سؤال

كنت مؤخرا يسأل أحدهم لماذا قال انه يفضل العودة بقوة كتبته مجموعة على IList.لقد فكرت دائما بأن البرمجة ضد واجهة أكثر مرونة وأفضل طريقة البرنامج عندما تواجه مع المشروع بعد حياة طويلة.لذلك بدأ غريبا لي عندما فأجاب:

عادة ما تفضل ثابتة أنواع أكثر قابلة للتغيير منها.المصفوفات هي غير قابل للتغيير.IList لا.

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

شكرا لأي مساعدة يا رفاق يمكن أن توفر.

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

المحلول

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

اعتقد مع عودة قائمة هناك شيئا قليلا ضمنا أنه موافق على تعديل أو أنه قد تتغير أثناء عودته إلى طائفة لا يعني هذا القدر.

على سبيل المثال, إذا كان لديك كائن نموذج على رأس مستودع وكان الأسلوب مثل GetCars() أن عاد قائمة مبرمج رأيت السيارات.إضافة(سيارة c) ...هل تعتقد انه كان مجنون تماما عن التفكير السيارات.Add(new Car()) قد تضيف سيارة في مخزن ؟ المصفوفات هي فقط بطبيعتها أكثر وضوحا.

أعتقد قائمة الاستخدام هو الأنسب في خصائص الصفحة.الضوابط.إضافة

أنا أفضل العودة المصفوفات في كثير من الأحيان من القائمة لأسباب عدة.

  • هذه العادة.مجموعات في 1.0/1.1 امتص

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

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

نصائح أخرى

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

والطريقة الوحيدة التي يمكن للArrray هو غير قابل للتغيير هي في طول انها. مرة واحدة يتم تخصيص صفيف، لا يمكن تغيير طول انها. حتى واجهات برمجة التطبيقات مثل Array.Resize لا تغيير حجم في الواقع مجموعة، وأنها مجرد تخصيص واحدة جديدة، نسخ محتويات والعودة مجموعة جديدة (بالإشارة في هذه الحالة).

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

وأنا دائما تفضل ReadOnlyCollection . جميع مزايا وجود قائمة، ولكن مقروءة فقط.

ونقطة واحدة كان يمكن أن يعني أن IList يتضمن إدراج، حذف، وإضافة طرق، وبالتالي فإن مجموعة نفسها يمكن تعديلها. T []، من ناحية أخرى، لا يمكن أن يكون عناصر تضاف إلى ذلك.

وأود أن أضيف أن FxCop توصي عودته ReadOnlyCollection بدلا من ذلك. للقراءة فقط مفهرس، وبالتالي لا يمكنك تغيير العناصر، وإضافة وطرق أخرى من هذا القبيل كل رمي NotSupportedException.

في المبدأ كان على حق، لكنه لا يعرف كيفية ممارسة بشكل صحيح ...

<اقتباس فقرة>   

ونحن نفضل عادة أنواع ثابتة   أكثر من تلك قابلة للتغيير.

وهذا هو الصحيح. أنواع ثابتة هي أجمل للعمل مع

<اقتباس فقرة>   

والمصفوفات هي ثابتة. IList ليست كذلك.

وهذا ليس صحيحا. أيا من تلك هي غير قابل للتغيير.

إذا كنت ترغب في العودة إلى المجموعة التي هو غير قابل للتغيير، والعودة إلى IEnumerable<T> أو ReadOnlyCollection<T> (باستخدام طريقة List<T>.AsReadOnly). لا يزال هؤلاء لا يحمي الكائنات إذا كانوا هم أنفسهم لا غير قابل للتغيير. إفنثوو يمكنك أن تقرأ فقط من المجموعات، لا يزال بإمكانك تغيير البيانات في كل كائن إذا كانت تسمح بذلك.

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

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

وعلى أي حال، ربما يجب عليك إلقاء نظرة على الموقع الرأي اريك ليبرت في حول هذا الموضوع. يمكن أن توفر لك مع بعض الذخيرة للمناقشة، أيضا.

ولعل هذا شخص لا يعرف ما يتحدث عنه؟

والسبب لاستخدام واجهة كنوع العائد على نوع الفعلي نفسه، هو لإخفاء تطبيق داخلي من المتصل. هذا allowes تنفيذ لتغيير نوع الفعلي دون repurcusions إلى باقي التطبيق.

وأنها لا تقدم أي معنى لنسخ مجموعة استخدامها داخليا في صفيف للاستخدام الخارجي، لا لسبب سوى قابلة للتغيير أو غير قابل للتغيير.

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

وأساسا يقوله "نحن نفضل الهياكل التي لا يمكن تغييرها بسهولة في وقت التشغيل، لأننا نعتقد أن يكونوا أقل عرضة للأخطاء." سواء كان ذلك صحيحا في هذه الحالة هو سؤال آخر.

وربما كان يقصد حجم المصفوفة بأنه "غير قابل للتغيير"؟ في الأساس، تقوم بتعريف الحجم مرة واحدة وكنت عالقا معها. مع القوائم، يمكنك دائما استخدام "إضافة".

أنا <م> افترض أن <م> إذا أنت <م> متأكد حول حجم القائمة، ربما مجموعة أسرع قليلا؟

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

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