سؤال

ما يفضل نوع الحاوية عند عودته كائنات متعددة من نفس النوع من العمل ؟

هو ضد الممارسات الجيدة للعودة بسيط array (مثل MyType []) ، أو يجب أن التفاف عليه في بعض عامة الحاوية (مثل ICollection<MyType>)?

وذلك بفضل!

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

المحلول

واريك ليبرت لديه في هذا الشأن. في حال كنت لا يمكن ازعجت لقراءة المقال بأكمله، فإن الجواب هو: العودة واجهة

نصائح أخرى

والعودة إلى IEnumerable<T> باستخدام yield return .

وأود أن إعادة IList<T> كما أن يعطي المستهلك وظيفة الخاص بك أكبر من المرونة.بهذه الطريقة إذا كان المستهلك وظيفة الخاص بك فقط في حاجة إلى تعداد تسلسل أنها يمكن أن تفعل ذلك, ولكن إذا كانوا يريدون استخدام تسلسل قائمة فإنها يمكن أن تفعل ذلك أيضا.

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

هذا هو الأقل الافتراض نهج لكم ، API المطور, يمكن أن تتخذ.لا يحق لك أن تقرر كيف المستهلك من وظيفة الخاص بك سوف تستخدم ما يرسلون لك - وهذا هو السبب في أنك سوف يعود IList<T> في هذه الحالة كما لمنحهم أكبر قدر من المرونة.أيضا لهذا السبب نفسه لن تفترض أنك تعرف ما هو نوع من المعلمة المستهلك سوف نرسل لك.إذا كنت تحتاج فقط إلى تكرار تسلسل أرسلت لك كمعلمة ثم جعل المعلمة IEnumerable<T> بدلا من List<T>.


تحرير (أكسيد): لأنه لا يبدو مثل هذا السؤال سوف تكون مغلقة ، أنا فقط أريد أن أضيف رابط من سؤال حول هذا: لماذا المصفوفات الضارة

لماذا لا List<T>؟

ومن منصب اريك ليبرت من قبل الآخرين المذكورة، ظننت أنني سوف تسليط الضوء على هذا:

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

إذا كنت بحاجة إلى تسلسل سوف تستخدم   IEnumerable<T>، إذا كنت بحاجة إلى تعيين   من أرقام متجاورة لبيانات وسوف أكون   استخدام List<T>، إذا كنت بحاجة إلى تعيين   عبر البيانات التعسفية سوف تستخدم ل   Dictionary<K,V>، إذا كنت في حاجة إلى مجموعة وسوف أكون   استخدام HashSet<T>. أنا ببساطة لا تحتاج   صفائف عن أي شيء، لذلك أنا أبدا تقريبا   استخدمهم. أنها لا تحل مشكلة I   لديهم أفضل من الأدوات الأخرى في بلدي   التخلص منها.

إذا للقراءة فقط المجموعة التي يجري عاد، وهذا يعني أنك لا تريد العناصر التي في جمع إلى تغيير، ثم استخدم IEnumerable<T>. هذا هو تمثيل أبسط من سلسلة للقراءة فقط غير قابل للتغيير (على الأقل من وجهة نظر التعداد نفسه) عناصر.

إذا كنت تريد أن تكون مجموعة بذاتها التي يمكن تغييرها، ثم استخدم ICollection<T> أو IList<T>.

وعلى سبيل المثال، إذا أردت لإرجاع النتائج من البحث لمجموعة معينة من الملفات، ثم العودة IEnumerable<FileInfo>.

ولكن، إذا أردت لفضح الملفات في دليل، ومع ذلك، سيعرض IList/ICollection<FileInfo> كما أنه من المنطقي أن كنت تريد أن ربما تغيير محتويات المجموعة.

وقطعة جيدة من النصائح التي سمعت كثيرا ما نقلت هو:

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

كن ليبرالية في ما كنت تقبل ودقيقة في ما تقدم.

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

وأخذ طريقة المثال الخاص بك، فما استقاموا لكم فاستقيموا إعادة كتابتها كما يلي:

public IList<object> Foo() 
{
    List<object> retList = new List<object>();
    // Blah, blah, [snip]
    return retList;
}

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

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

وبالمثل، يجب أن يكون لديك المعلمات العام قدر الإمكان - بدلا من قبول صفيف، قبول IEnumerable من النوع المناسب. هذا هو متوافق مع المصفوفات وكذلك القوائم وأنواع أخرى مفيدة.

وأخذ طريقة سبيل المثال مرة أخرى:

public IList<object> Foo(IEnumerable<object> bar) 
{
    List<object> retList = new List<object>();
    // Blah, blah, [snip]
    return retList;
}
return ICollection<type>

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

ودائما إرجاع نوع واجهة الذي يقدم أكبر قدر من الوظائف إلى الطالب. حتى في حالة ICollection<YourType> الخاص بك يجب أن تستخدم.

وشيء مثير للاهتمام هو أن نلاحظ أن المطورين بي سي إل حصل فعلا هذا خطأ في مكان ما من .NET Framework - راجع <لأ href = "http://blogs.msdn.com/ericlippert/archive/2008/09/22 /arrays-considered-somewhat-harmful.aspx "يختلط =" نوفولو noreferrer "> هذا اريك ليبرت بلوق وظيفة للحصول على تلك القصة.

لماذا لا IList<MyType>؟

وانها تؤيد فهرسة المباشرة التي هي السمة المميزة لمجموعة دون إزالة إمكانية لإرجاع List<MyType> في يوم من الأيام. إذا كنت ترغب في قمع هذه الميزة، ربما كنت ترغب في العودة IEnumerable<MyType>.

وذلك يعتمد على ما كنت تنوي القيام به مع مجموعة كنت العودة. إذا كنت مجرد بالتكرار، أو إذا كنت تريد فقط للمستخدم أعاد، ثم وأنا أتفق معDaniel، والعودة IEnumerable<T>. إذا كنت فعلا تريد أن تسمح عمليات القائم على القائمة، إلا أنني سوف أعود IList<T>.

واستخدام الأدوية. انه من الاسهل للتعامل مع فئات مجموعات أخرى ونظام النوع هو أكثر قدرة على مساعدتك في الأخطاء المحتملة.

والنمط القديم للعودة مجموعة وعكاز قبل الوراثة.

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

وهناك مزايا كبيرة لصالح IEnumerable على أي شيء آخر، وهذا يوفر لك أكبر قدر من المرونة التنفيذ ويتيح لك استخدام yield return أو ينق المشغلين لتنفيذ كسول.

إذا كان الطالب يريد List<T> بدلا من ذلك يمكن الاتصال بالرقم ToList() على كل ما عاد، وسوف يكون الأداء الكلي تقريبا نفس كما لو كنت قد خلقت وعاد List<T> جديدة من طريقتك.

وصفيف هو ضار، ولكن ICollection<T> ضار أيضا.

سوف

وICollection<T> لا يمكن أن تضمن الكائن يكون غير قابل للتغيير.

وتوصيتي هي التفاف الكائن عودته مع ReadOnlyCollection<T>

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