Usually it's best to expose the least powerful interface that the user can still meaningfully work with. If the user just needs some enumerable data, return IEnumerable
. If that's not enough because the user needs to be able to modify the list (attention! shouldn't often be the case), return an IList
.
/EDITAȚI | ×:
Joel întreabă o întrebare validă în comentariul său: De ce, într-adevăr, expuneți interfața cea mai puțin puternică în locul acordării puterii maxime a utilizatorului? (Parafrazat)
Ideea din spatele acestui lucru este că metoda returnând datele ar putea să nu se aștepte ca utilizatorul să-și modifice conținutul: O altă metodă a clasei ar putea aștepta ca lista să nu fie goală după ce o referință la ea a fost returnată. Imaginați-vă că utilizatorul elimină toate datele din listă. Cealaltă metodă trebuie să facă o verificare suplimentară, care ar putea să nu fie necesară.
Mai important, acest lucru expune părți din implementarea internă prin intermediul tipului de returnare. Dacă am nevoie să modificăm implementarea în viitor, astfel încât să nu mai folosească un container IList
, am o problemă: fie trebuie să schimb contractul de metode, introducând o schimbare de performanță. Sau trebuie să copiez datele într-un container.
Ca exemplu, imaginați-vă că o implementare eficientă utilizează un Dicționar și returnează colecția Values
care nu implementează IList
.