#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 в aList<object>
, бокса быть не должно.
Ответ №1:
Ваше понимание на высоте.
Мое любопытство возникло потому, что я пытался разработать метод, который требовал
IEnumerable<T>
. Итак, если я дам ему aList<int>
или aList<SomeObject>
, он работает точно так же, тип T не имеет значения, и все довольны, поскольку это ссылка на предоставляемую коллекцию, да?
Да, values
это ссылка на коллекцию. Это не влияет на характер его элементов.
Также! Это не имеет никакого отношения к боксу, верно? Поскольку
List<T>
имеет ссылочную семантику, только структурная реализацияIEnumerable<T>
будет включать в себя бокс (но это похоже на катастрофу, ожидающую своего часа)
Да; весь смысл общих коллекций состоит в том, чтобы полностью избегать бокса. Ни сам список, ни его элементы типа значения не помещаются в коробку (если только сам список не является List<object>
, и в этом случае его элементы помещаются в коробку).
Комментарии:
1. Отлично, я рад, что все хорошо. Почти похоже на пустой вопрос, но, надеюсь, кто-то еще что-то получит от этого. Спасибо!