لماذا يعيد enumerable.tolookup <> () iLookup <،> وليس البحث <،>؟

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

  •  27-09-2019
  •  | 
  •  

سؤال

هنالك واحد الطريقة في Lookup<,> هذا ليس في ILookup<,>:

public IEnumerable<TResult> ApplyResultSelector<TResult>(
    Func<TKey, IEnumerable<TElement>, TResult> resultSelector);

لماذا هو نوع العودة من Enumerable.ToLookup<>() أعلن أن يكون ILookup<,> على الرغم من حقيقة أنه يبدو دائمًا أنه يعيد مثيلًا Lookup<,>؟ إذا تم إعلان نوع العودة بدلاً من ذلك Lookup<,>, ، يمكن استخدام الطريقة أعلاه بدون طاقم.

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

المحلول

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

كما تشير ، ToList و ToDictionary إرجاع أنواع الخرسانة بدلاً من الواجهات. ربما السبب في ذلك هو ذلك ToList و ToDictionary كان من المفترض أن أعيد لك نسخة يمكنك تعديل هل تريد ذلك. منذ IList و IDictionary لا تضمن لك الواجهات أنها قابلة للتحرير (والتي ربما كانت فكرة سيئة) ، قرر المصممون إعادة نوع الخرسانة.

تخيل افتراضية ToIList() طريقة. إذا تم استدعاؤها على صفيف ، يمكن تنفيذها لإرجاع نسخة من الصفيف ، لأن المصفوفات تنفذ IList<T>. قد تتفاجأ بعد ذلك لمعرفة ذلك الاتصال Add() رميات.

من ناحية أخرى، ILookup هي واجهة للقراءة فقط ، لذلك لا ينطبق ما ورد أعلاه. وبالتالي لا يوجد سبب ليس لمتابعة أفضل الممارسات ، كما هو الحال مع ToList.

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