gpt4 book ai didi

c# - List.Enumerator 的 Reset 方法的行为

转载 作者:可可西里 更新时间:2023-11-01 09:08:56 25 4
gpt4 key购买 nike

以下两种方法(一种使用 IEnumerator<int> ,另一种使用 List<int>.Enumerator )即使看起来相同会产生不同的结果。

static void M1()
{
var list = new List<int>() { 1, 2, 3, 4 };
IEnumerator<int> iterator = list.GetEnumerator();
while (iterator.MoveNext())
{
Console.Write(iterator.Current);
}
iterator.Reset();
while (iterator.MoveNext())
{
Console.Write(iterator.Current);
}
}
static void M2()
{
var list = new List<int>() { 1, 2, 3, 4 };
//Here the iterator will be List<int>.Enumerator (which is a struct)
var iterator = list.GetEnumerator();
while (iterator.MoveNext())
{
Console.Write(iterator.Current);
}
//This will not work, as Reset method was implemented explicitly
//iterator.Reset();

//So casting it to IEnumerator is required
//which will lead to boxing and other issues of struct and interface
((IEnumerator<int>)iterator).Reset();

//Following loop will NOT work
while (iterator.MoveNext())
{
Console.Write(iterator.Current);
}
}

有几个问题可以清楚地解释这种行为,您可以查看它们 here , here , 和 here .

我还有以下两个疑惑

  1. 为什么 List.Enumerator 不为重置抛出“NotSupportedException”?
  2. 为什么 Reset 是显式实现的,而不是像 MoveNext 和 Current 那样隐式实现的?

最佳答案

Why List.Enumerator does not throw "NotSupportedException" for Reset?

因为微软没有时间机器可以预见 5 年后会发生什么。类型推断背后的强大插入力是 Linq,它只是在 1990 年代末首次开发泛型时不在路线图上。没有它,拳击问题就不是问题。

Why Reset was implemented explicitly and not implicitly like MoveNext and Current?

因为你不能取消继承一个接口(interface)方法,你只能隐藏它。 IEnumerator 有一个 Reset() 方法是另一个时间机器问题,这是在 1995 年设计 COM Automation 时决定的。选择和结果之间大约还有 5 年的差距 :) .NET 必须 提供 COM iterators 之间的良好映射和 .NET 迭代器有机会被采用。

从链接中可以看出,COM 迭代器的另一个功能是克隆。这是 ICloneable 接口(interface)背后的插入力,这是 .NET 中另一个非常麻烦的接口(interface)。那个在他们的泛型兄弟中实现起来太麻烦了,只有非泛型集合枚举器实现了它。

微软的工作很艰巨,每一个设计决定都是他们必须永远忍受的。我们的要简单得多,我们可以简单地不使用 Reset :)

关于c# - List<T>.Enumerator 的 Reset 方法的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23150668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com