Prima di generare i generici in .NET, era prassi comune creare collezioni "tipizzate" in modo da avere class CarCollection
ecc. per ogni tipo che dovevi raggruppare. In .NET 2.0 con l'introduzione di Generics, è stata introdotta una nuova classe List<T>
che ti risparmia la necessità di creare CarCollection
ecc perché puoi creare List<Car>
.
La maggior parte delle volte, troverai che List<T>
è sufficiente per i tuoi scopi, tuttavia potrebbero esserci momenti in cui desideri avere un comportamento specifico nella tua raccolta, se ritieni che sia così, hai un paio delle opzioni:
- Crea una classe che incapsula
List<T>
ad esempio public class CarCollection { private List<Car> cars = new List<Car>(); public void Add(Car car) { this.cars.Add(car); }}
- Crea una raccolta personalizzata
public class CarCollection : CollectionBase<Car> {}
Se scegli l'approccio di incapsulamento, dovresti almeno esporre l'enumeratore in modo da dichiararlo come segue:
public class CarCollection : IEnumerable<Car>
{
private List<Car> cars = new List<Car>();
public IEnumerator<Car> GetEnumerator() { return this.cars.GetEnumerator(); }
}
Senza farlo, non puoi fare un foreach
sulla collezione.
Alcuni motivi per cui potresti voler creare una raccolta personalizzata sono:
- Non vuoi esporre completamente tutti i metodi in
IList<T>
o ICollection<T>
- Vuoi eseguire ulteriori azioni aggiungendo o rimuovendo un oggetto dalla raccolta
È una buona pratica? beh ciò dipende da perché lo stai facendo, se è per esempio uno dei motivi che ho elencato sopra allora sì.
Microsoft lo fa abbastanza regolarmente, ecco alcuni esempi abbastanza recenti:
Come per i tuoi metodi FindBy
, sarei tentato di inserirli nei metodi di estensione in modo che possano essere utilizzati contro qualsiasi raccolta contenente auto:
public static class CarLookupQueries
{
public static Car FindByLicencePlate(this IEnumerable<Car> source, string licencePlate)
{
return source.SingleOrDefault(c => c.LicencePlate == licencePlate);
}
...
}
Questo separa la preoccupazione di interrogare la collezione dalla classe che memorizza le macchine.