Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
dl.Add(tr3);
foreach(StreamReadersrindl)
{
Console.WriteLine($"sr.ReadLine()::{sr.ReadLine()}");
}
//WywołajDispose,zanimktórykolwiekzobiektówzostanie
//usuniętyzobiektuDisposableList.
dl.RemoveAt(0);
dl.Remove(tr1);
dl.Clear();
}
Omówienie
Słowokluczowe
where
służydoograniczaniaparametrutypuwtakisposób,byprzyjmo-
wanebyływyłącznieargumentyspełniającetoograniczenie.Przykładowo
DisposableList
zawieraograniczenie,żekażdyargument
T
musiimplementowaćinterfejs
IDisposable
:
publicclassDisposableList<T>:IList<T>
whereT:IDisposable
Oznaczato,żeponiższykodskompilujesiępomyślnie:
DisposableList<StreamReader>dl:newDisposableList<StreamReader>();
natomiasttenkodjużnie:
DisposableList<string>dl:newDisposableList<string>();
Powodemjestto,żewprzeciwieństwiedotypu
StreamReader
,typ
string
nieimplemen-
tujeinterfejsu
IDisposable
.
Pozawymaganiemimplementacjikonkretnegointerfejsumożliwerównieżinne
ograniczeniaargumentówtypu.Możemywymusić,bytypdziedziczyłpookreślonejklasie
bazowej,takiejjaknaprzykładklasa
TextReader
:
publicclassDisposableList<T>:IList<T>
whereT:System.IO.TextReader
,IDisposable
Możemyrównieżokreślić,żeparametrtypumabyćzawężonywyłączniedotypówwar-
tościlubtypówreferencyjnych.Poniższadeklaracjaklasyograniczajedyniedotypów
wartości:
publicclassDisposableList<T>:IList<T>
whereT:struct
Zkoleitadeklaracjaograniczaklasęwyłączniedotypówreferencyjnych:
56
|
Rozdział1:Klasyitypygeneryczne