Имеет ли значение T при передаче IEnumerable ?

#c# #.net #generics #collections #parameter-passing

#c# #.net #дженерики #Коллекции #передача параметров

Вопрос:

Просто дважды проверьте мое понимание семантики ссылок / значений:

Допустим, я сделал List<T> values = new List<T>();

  • Если T является ссылочным типом, то values содержит ссылку на коллекцию T. Однако каждый элемент этой коллекции является ссылкой на данные.

  • Если T является типом значения, то values содержит ссылку на коллекцию T. Однако каждый элемент этой коллекции содержит фактические данные.

Мое любопытство возникло потому, что я пытался разработать метод, который требовал IEnumerable<T> . Итак, если я дам ему a List<int> или a List<SomeObject> , он работает точно так же, тип T не имеет значения, и все довольны, поскольку это ссылка на предоставляемую коллекцию, да?

 public sealed class Effect<T>
{
    public void Apply(GameTime time, IEnumerable<T> values)
    {
        ...
    }
}
  

Также! Это не имеет никакого отношения к боксу, верно? Поскольку List<T> имеет ссылочную семантику, только структурная реализация IEnumerable<T> будет включать в себя бокс (но это похоже на катастрофу, ожидающую своего часа)

Комментарии:

1. В вашем Effect классе либо метод, либо класс должны быть универсальными, т. Е. class Effect<T> Или void Apply<T>(...) .

2. Пока вы не добавляете int s в a List<object> , бокса быть не должно.

Ответ №1:

Ваше понимание на высоте.

Мое любопытство возникло потому, что я пытался разработать метод, который требовал IEnumerable<T> . Итак, если я дам ему a List<int> или a List<SomeObject> , он работает точно так же, тип T не имеет значения, и все довольны, поскольку это ссылка на предоставляемую коллекцию, да?

Да, values это ссылка на коллекцию. Это не влияет на характер его элементов.

Также! Это не имеет никакого отношения к боксу, верно? Поскольку List<T> имеет ссылочную семантику, только структурная реализация IEnumerable<T> будет включать в себя бокс (но это похоже на катастрофу, ожидающую своего часа)

Да; весь смысл общих коллекций состоит в том, чтобы полностью избегать бокса. Ни сам список, ни его элементы типа значения не помещаются в коробку (если только сам список не является List<object> , и в этом случае его элементы помещаются в коробку).

Комментарии:

1. Отлично, я рад, что все хорошо. Почти похоже на пустой вопрос, но, надеюсь, кто-то еще что-то получит от этого. Спасибо!