只需仔细检查我对参考/值语义的理解:
假设我做了List<T> values = new List<T>();
如果 T 是参考类型,则values
包含对 T 集合的引用。但是,此集合的每个元素都是对数据的引用。
如果 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>
的结构实现会涉及装箱(但这似乎是等待发生的灾难)
答案 0 :(得分:4)
你的理解是正确的。
我的好奇心产生了,因为我试图设计一种需要
IEnumerable<T>
的方法。因此,如果我给它List<int>
或List<SomeObject>
,它的工作方式完全相同, T 的类型无关紧要,每个人都很高兴,因为它是引用正在提供的集合,是吗?
是的,values
是对集合的引用。这不会影响其物品的性质。
另外!这跟拳击无关,对吧?由于
List<T>
具有引用语义,因此只有IEnumerable<T>
的结构实现会涉及装箱(但这似乎是等待发生的灾难)
是;通用集合的全部要点是完全避免拳击。列表本身及其值类型项都没有装箱(除非列表本身是List<object>
,在这种情况下,它的项目是装箱的。)