К чему сводятся обобщенные методы C# в неуниверсальном классе?
Если у меня есть такой класс: -
static class Foo {
public static void Bar<T>(T item) { Console.WriteLine(item.ToString(); }
}
Я знаю, что в этом примере нет необходимости использовать T, так как все типы имеют ToString() и т. Д. - это просто надуманный пример. Что меня больше интересует, так это то, что происходит под капотом с точки зрения следующего: -
Foo.Bar("Hello");
Foo.Bar(123);
Foo.Bar(new Employee("Isaac"));
Я в общих чертах (думаю!) Я понимаю овеществление, т. Е. Если вы делаете разные типы обобщенного класса, например
List<Int32>
List<String>
List<Employee>
и т.д., затем во время компиляции (или во время выполнения?) мы получаем три фактических конкретных типа, по одному для каждого указанного общего аргумента. Относится ли то же самое к вызовам методов в моем первом примере, т. Е. Будет ли у нас один класс Foo, но три метода Barified, один для String, Int32 и Employee?
1 ответ
Вот где разница между шаблонами C++ и обобщениями C# вступает в игру.
В C++ шаблоны заставляют генерировать новый метод для каждого типа, с которым он используется. Однако в C# код в методе создается только один раз. Тот же код выполняется независимо от того, вызываете ли вы int
, string
, или же object
параметр типа.
Поскольку дженерики C# остаются обобщенными при компиляции, они могут быть представлены в скомпилированных библиотеках без необходимости повторной компиляции. В C++ вы должны включить исходный шаблон в ваш потребляющий код, чтобы можно было скомпилировать новую копию.
Проще говоря, вы получаете только один скомпилированный метод на общий метод.