C# обобщения vs object

291
16 июля 2018, 21:20
 class GenericClass<T>
{
    T val;
    public T value
    {
        get
        {
            return val;
        }
        set
        {
            val = value;
        }
    }
}

class ObjectClass
{
    object val;
    public object value
    {
        get
        {
            return val;
        }
        set
        {
            val = value;
        }
    }
}

Какая разница между этими двумя класами? Что в первом универсальный тип данных - что во втором. Более того, насколько я знаю, компилятор тип данных T все равно приводит к типу object.

Answer 1

Универсальные шаблоны (или же обощения) в C# вводят концепцию параметров универсального типа. Благодаря им можно создавать классы и методы с типами, спецификация которых отложена до момента объявления и создания экземпляров в клиентском коде.

class GenericClass<T>
{
    T val;
    public T value
    {
        get { return val; }
        set { val = value; }
    }
}

У вас показан класс с параметром T универсального типа (обычно такие подходы используют для работы с коллекциями, причем чаще всего их использут совместно с заданичем ограничения с помощью where, которое включают в себя все ограничения базового типа T). Этот класс может использоваться в другом клиентском коде, не требуя ресурсов и не создавая рисков, связанных с операциями приведения и упаковки-преобразования в среде выполнения. Универсальные классы могут вносить некое ограничение типов (когда мы напишем конструкцию where), то есть они разрешают доступ только для определенных типов данных. Что дает основополагающий плюс и видимый выйгрыш.

Однако следующий код:

class ObjectClass
{
    object val;
    public object value
    {
        get { return val; }
        set { val = value; }
    }
}

Несет на борту определенный тип (пусть это object, но ведь он определенный, хоть и наследуется всеми типами), что в свою очередь приведет к операциями приведения и упаковки-преобразования. Что повлечет за собой трату ресурсов (ну и времени конечно же). Иными словами это ведет к потере безопасности типов и понижению производительности, когда универсальные шаблоны этой проблемы не имеют.

Если выбирать между универсальными шаблонами и object - я бы несомненно выбрал универсальные шаблоны (обобщения).

Ну и для справки будет полезно:

  • Универсальные шаблоны
  • object
READ ALSO
InitialDirectory для FileDialog

InitialDirectory для FileDialog

Всем привет :) Как можно добавить InitialDirectory для FileDialog в файл конфигурации XML?

212
Как отловить null в ComboBox.SelectedItem?

Как отловить null в ComboBox.SelectedItem?

Есть кусок кода, который формирует путь по шаблону с добавлением выбранных пунктовWorkerList - это и есть ComboBox

185
C# Разгадываниe текста по картинке

C# Разгадываниe текста по картинке

У меня есть картинка с текстом написанным необычным шрифтом

147
IAsyncOperation&lt;StoreProductResult&gt; не содержит определения для GetAwaiter

IAsyncOperation<StoreProductResult> не содержит определения для GetAwaiter

Есть проект на Xamarin Forms наnet standart 2

187