لماذا يعيد enumerable.tolookup <> () iLookup <،> وليس البحث <،>؟
-
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
.