C# Почему обобщения (generics) называют универсальными шаблонами?


#1

В нескольких статьях встретил понятие "универсального шаблона", мне стало интересно что это. Оказалось что под универсальными шаблонами имелись ввиду обобщения, но тут несоответствие, ведь обычно под шаблоном имеют ввиду какой-то пример используемый для создания других примеров, а обобщения этого не реализуют. Так почему обобщения называют универсальными шаблонами?


#2

Если не ошибаюсь, то обобщения в C# пришли из С++ и именно там они являлись универсальными шаблонами. Например существует следующий параметризированный класс:

class MyClass<T>
{
    private T Name { get; set; }
}

то в С++ при создании экземпляра данного класса и закрытия его любым типом будет создаваться отдельный класс, в котором везде вместо типа T подставится переданный тип. Поэтому их и назвали универсальными шаблонами, но в C# не будет создаваться отдельный класс для каждого экземпляра с разными закрытым типом. Например, есть следующий код на C# :

class MyClass<T>
{
        private T Name { get; set; }
 }

class Program
{
    static void Main()
    {
        MyClass<int> a = new MyClass<int>();

        MyClass<string> b = new MyClass<string>();

        MyClass<long> c = new MyClass<long>();

        Console.ReadKey();
    }
} 

Если вскрыть через dotPeek скомпилированный запускной файл, то будет присутствовать только указанный в коде класс.

Поэтому в C# обобщение нежелательно называть универсальными шаблонами.