传递IEnumerable <t>时是否重要?</t>

时间:2014-06-23 11:23:43

标签: c# .net generics collections parameter-passing

只需仔细检查我对参考/值语义的理解:

假设我做了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>的结构实现会涉及装箱(但这似乎是等待发生的灾难)

1 个答案:

答案 0 :(得分:4)

你的理解是正确的。

  

我的好奇心产生了,因为我试图设计一种需要IEnumerable<T>的方法。因此,如果我给它List<int>List<SomeObject>,它的工作方式完全相同, T 的类型无关紧要,每个人都很高兴,因为它是引用正在提供的集合,是吗?

是的,values是对集合的引用。这不会影响其物品的性质。

  

另外!这跟拳击无关,对吧?由于List<T>具有引用语义,因此只有IEnumerable<T>的结构实现会涉及装箱(但这似乎是等待发生的灾难)

是;通用集合的全部要点是完全避免拳击。列表本身及其值类型项都没有装箱(除非列表本身是List<object>,在这种情况下,它的项目是装箱的。)