public int BinarySearch(T
public bool Contains(T
public void CopyTo(T
public int FindIndex(System.Predicate‹T
public T FindLast(System.Predicate‹T
public bool Remove(T
public int RemoveAll(System.Predicate‹T
public T
public bool TrueForAll(System.Predicate‹T
public T
…
}
}
Когда вы создаете тип List‹T› и указываете для него SportsCar, это эквивалентно следующему определению типа List‹T›.
namespace System.Collections.Generic {
public class List‹SportsCar
…
public void Add(SportsCar
public IList‹SportsCar
public int BinarySearch(SportsCar
public bool Contains(SportsCar
public void CopyTo(SportsCar
public int FindIndex(System.Predicate‹SportsCar
public SportsCar FindLast(System.Predicate‹SportsCar
public bool Remove(SportsCar
public int RemoveAll(System.Predicate‹SportsCar
publiс SportsCar
public bool TrueForAll(System.Predicate‹SportsCar
public SportsCar
…
}
}
Конечно, когда вы создаете обобщенный List‹T›, нельзя сказать, что компилятор буквально создает совершенно новую реализацию типа List‹T›. Он обращается только к тем членам обобщенного типа, которые вы вызываете фактически. Чтобы пояснить это, предположим, что вы используете List‹T› для объектов SportsCar так.
static void Main(string[] args) {
// Проверка List, содержащего объекты SportsCars.
List‹SportsCar› myCars = new List‹SportsCar›();
myCars.Add(new SportsCar());
Console.WriteLine("Your List contains {0}", myCars.Count);
}
Если с помощью ildasm.exe проверить генерируемый CIL-код, обнаружатся следующие подстановки.
.method private hidebysig static void Main(string[] args) cil managed {
.entrypoint
.maxstack 2
.locals init ([0] class [mscorlib] System.Collections.Generic.'List`1'‹class SportsCar›
newobj instance void class [mscorlib]System.Collections.Generic.'List`1'‹class SportsCar›
stloc.0
ldloc.0
newobj instance void CollectionGenerics.SportsCar::.ctor()
callvirt instance void class [mscorlib]System.Collections.Generic.'List`1'‹class SportsCar›::
nop
ldstr "Your List contains {0} item(s)."
ldloc.0
callvirt instance int32 class [mscorlib] System.Collections.Generic.'List`1' ‹class SportsCar
box [mscorlib] System.Int32
call void [mscorlib]System.Console::WriteLine(string, object)
nop
ret
}
Теперь, после изучения процесса использования обобщенных типов из библиотек базовых классов, в оставшейся части главы мы рассмотрим вопросы создания обобщенных методов, типов и коллекций.
Создание обобщенных методов