【问题标题】:Why is there only a static/shared version of ForEach for arrays?为什么数组只有一个静态/共享版本的 ForEach?
【发布时间】:2011-08-18 05:47:56
【问题描述】:

有人可以解释一下为什么对于数组只有一个静态/共享版本的 ForEach 吗?

IE: ForEach<T>(T array[], System.Action(Of T) action[])

我认为这与实现实例方法的类型推断要求有关,但是当您声明数组时,您提供的类型对吗?

【问题讨论】:

    标签: c# vb.net arrays generics foreach


    【解决方案1】:

    数组的一个问题是没有地方可以记录实例方法,这些方法只能在“向量”上使用。 “向量”是一个基数为 0 的一维数组 - 因此,在 C# 中任何可以表示为 T[] 的东西都是向量,但 T[,] 不是,例如。

    这意味着不是Array 的每个实例都应该有该方法——即使有,你将如何表示T?每个数组类型都是独立的,在 .NET 中没有 generic 类型,它是所有数组的基类。我们只有Array

    因此,鉴于我们必须在类型系统中的某处引入类型参数,并且我们还将其限制为“向量”类型,因此静态方法似乎是一种合适的解决方法。

    注意List&lt;T&gt; 的情况不是,我们已经有了类型参数,所以可以创建一个简单的实例方法。

    同样值得考虑的是,使用Array.ForEach 最终得到的代码比仅仅使用foreach 循环更简洁。我通常只会在我已经有一个委托对每个元素执行时才使用它。否则,语言结构会感觉更干净,而且毫无例外地返回或跳出循环的能力肯定更灵活。

    【讨论】:

      【解决方案2】:

      你提供 T 来告诉数组可以包含什么。所以由于 Array 实现了 ienumerable,因此它得到了 ForEach 扩展方法。

      你还有什么要找的吗?

      想知道 Erics 的帖子是否对您有帮助 http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

      【讨论】:

      • 你说的是哪个ForEach扩展方法?
      • erics 谈论的ForEach
      • 框架中不是,请注意。所以对于大多数人来说,数组不会“得到”ForEach 扩展方法。你必须自己提供一个。还要注意ForEach 通常是IEnumerable&lt;T&gt; 上的扩展方法,而不是IEnumerable,所以实际上更多的是关于实现IEnumerable&lt;T&gt; 的向量...如果你只有Array 类型的引用,你我想先打电话给Cast&lt;T&gt;()OfType&lt;T&gt;()
      • 是的,即使 Ops qs 也有 Array 东西,所以认为 ForEach 应该是它的扩展。
      • 乔恩说得对。数组不继承 ForEach(T[], Action) 扩展。您可能正在考虑 List,它定义了 ForEach(Action) 签名,但这不是扩展方法,也不是继承的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 2010-11-08
      • 2019-02-14
      相关资源
      最近更新 更多