【问题标题】:Does T matter when passing IEnumerable<T>?传递 IEnumerable<T> 时 T 是否重要?
【发布时间】:2014-06-23 11:23:43
【问题描述】:

仔细检查我对引用/值语义的理解:

假设我做了一个List&lt;T&gt; values = new List&lt;T&gt;();

  • 如果 Treference 类型,则 values 包含对 T 集合的引用。但是,此集合的每个元素都是对数据的引用。

  • 如果 Tvalue 类型,则 values 包含对 T 集合的引用。但是,此集合的每个元素都包含实际数据。

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

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

还有!这和拳击无关吧?由于List&lt;T&gt; 具有引用语义,因此只有IEnumerable&lt;T&gt; 的结构实现会涉及装箱(但这似乎是一场等待发生的灾难)

【问题讨论】:

  • Effect 类中,方法或类必须是通用的,即class Effect&lt;T&gt;void Apply&lt;T&gt;(...)
  • 只要不将ints 加到List&lt;object&gt; 中,就应该没有装箱。

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


【解决方案1】:

你的理解是正确的。

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

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

还有!这和拳击无关吧?由于List&lt;T&gt; 具有引用语义,因此只有IEnumerable&lt;T&gt; 的结构实现会涉及装箱(但这似乎是一场等待发生的灾难)

是的;泛型集合的全部意义在于完全避免装箱。列表本身和它的值类型项都没有被装箱(除非列表本身是List&lt;object&gt;,在这种情况下,它的项目被装箱)。

【讨论】:

  • 完美,我很高兴一切都很好。几乎感觉像是在浪费一个问题,但希望其他人能从中得到一些东西。谢谢!
猜你喜欢
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 2015-03-19
相关资源
最近更新 更多