Как генерики устраняют или уменьшают потребность в боксе? - PullRequest
3 голосов
/ 13 апреля 2011

Читая книгу VS 2010 Джона Шарпа, он говорит, что дженерики позволяют устранить необходимость приведения, уменьшить бокс типов значений - уменьшить? Я думал, что его сняли, а также кастинг? Кто-нибудь может объяснить, пожалуйста?

Ответы [ 2 ]

5 голосов
/ 13 апреля 2011

Это не полностью устраняет использование бокса и кастинга ... оно просто значительно уменьшает их. Иногда вы действительно знаете больше, чем компилятор о типах вещей. Например, предположим, что вы подключили один и тот же обработчик событий ко многим кнопкам. Это совсем необоснованно использовать:

public void HandleClickEvent(object sender, EventArgs e)
{
    // We know it will always be a button, and we want an exception if it's not
    Button button = (Button) sender;
    ...
}

Вот и все - кастинг не умер.

Точно так же происходит бокс, в ситуациях, когда вы не знаете точный тип во время компиляции и не можете выразить его в общем виде. Два наиболее очевидных примера этого:

  • Отражение (выбор значения свойства с отражением даст вам object, если необходимо, бокс)
  • Динамическая типизация в C # 4:

    dynamic d = CreateDynamicObject();
    int x = d.Foo(); // The dynamic call would have to box if necessary,
                     // the conversion will unbox
    

Так что бокс тоже не умер.

Если вы только говорите о хранении значений в коллекциях, то это правда, что бокс и приведение теперь появляются в коде намного, намного реже, чем раньше. Но не все в коллекции, и дженерики полезны и вне коллекций.

1 голос
/ 13 апреля 2011

Несколько лет назад мне удалось разобраться с дженериками: рассмотреть возможность использования дженерика, когда:

Вы добавляете параметр в метод, содержащий информацию о типе

public object Parse(string input, Type outputType) 
// replace by:
public T Parse<T>(string input)

Вы используете поле экземпляра, которое содержит информацию о типе:

class Foo
{
    private Type _wrappedObjectType;
    private object _wrappedObject;
}
// replace by
class Foo<T>
{
    private T _wrappedObject;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...