2014-06-23 2 views
3

Просто двойная проверка моего понимания ссылки/значение семантики:Имеет значение T при передаче IEnumerable <T>?

Давайте говорить, что я сделал List<T> values = new List<T>();

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

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

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

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

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

+1

В вашем классе 'Effect' либо метод, либо класс должен быть общим, т. Е.' Class Effect 'или' void Применить (...) '. – Onur

+1

Пока вы не добавляете 'int' в 'Список ', бокса не должно быть. – Onur

+0

Спасибо, обновлено. –

ответ

4

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

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

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

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

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

+0

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

Смежные вопросы