枚举器和函数作用域

Vtortola

为什么Enumerator在同一功能中不能跟踪项目,而MoveNext在其他功能中发生操作,为什么不能跟踪项目

例:

    public static void Test()
    {
        var array = new List<Int32>(new Int32[] { 1, 2, 3, 4, 5 });
        var e = array.GetEnumerator();
        e.MoveNext();
        e.MoveNext();
        Console.WriteLine(e.Current); // 2
        Incremenet(e);
        Console.WriteLine(e.Current); //2
    }

    static void Incremenet(IEnumerator<Int32> e)
    {
        Console.WriteLine("Inside " + e.Current); //2
        e.MoveNext();
        Console.WriteLine("Inside " + e.Current); // 3
        e.MoveNext();
        Console.WriteLine("Inside " + e.Current); //4
    }

我原本希望在最后的CW中获得5,但我却获得2,因为它从未增加。为什么在函数返回时忘记了函数MoveNext内部Increment

干杯。

S队

List<T>的枚举类型List<T>.Enumerator不是a class,而是a struct由于GetEnumerator公开了返回类型为List<T>.Enumerator,当您使用时var,其e类型为List<T>.Enumerator,因此当您将其传递给时Incremenet,它会自动装箱成为一个IEnumerator<Int32>对象。这是您看到的奇怪行为的原因。

如果您输入eas IEnumerator<Int32>,则在您获得对象后立即进行装箱,因此不会发生这种奇怪的行为:无论您在其中运行其他代码Test还是在其中运行其他代码,其作用都相同Increment(我固定了该方法的拼写方式,它不是“ Incremenet”)。

public static void Test()
{
    var array = new List<Int32> { 1, 2, 3, 4, 5 };
    IEnumerator<Int32> e = array.GetEnumerator(); // boxed here
    e.MoveNext();
    e.MoveNext();
    Console.WriteLine(e.Current); // 2
    Increment(e);
    Console.WriteLine(e.Current); // now it's 4
}

static void Increment(IEnumerator<Int32> e)
{
    Console.WriteLine("Inside " + e.Current); // 2
    e.MoveNext();
    Console.WriteLine("Inside " + e.Current); // 3
    e.MoveNext();
    Console.WriteLine("Inside " + e.Current); // 4
}

它以其类型公开,而不是IEnumerator<T>出于性能原因。在这种情况下foreach 非常聪明,可以调用MoveNext并且Current无需装箱或虚拟派遣,并且可以毫无问题地处理值类型语义。如您所见,当您不十分注意如何处理它时,确实会造成混乱,因为可变struct的是邪恶的

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

开启作用域枚举

来自分类Dev

Coffeescript空格,参数和函数作用域

来自分类Dev

C ++移动构造函数和作用域

来自分类Dev

Javascript 函数作用域和参数

来自分类Dev

如何使用libclang检测枚举和作用域枚举之间的区别?

来自分类Dev

JS局部和全局作用域变量和函数

来自分类Dev

从控制器外部的JS触发作用域函数

来自分类Dev

控制器内的角$ http函数作用域

来自分类Dev

链接器函数的作用域在angularjs指令中表示什么

来自分类Dev

函数内部的作用域

来自分类Dev

Javascript函数关闭和对父作用域的访问

来自分类Dev

在bind()绑定的函数中使用this和this的作用域

来自分类Dev

函数在加载作用域和视图之前正在运行

来自分类Dev

胖箭头函数的作用域和jQuery回调

来自分类Dev

sh-5.0$ 中的 bash 函数和作用域

来自分类Dev

Javascript 函数作用域和执行上下文

来自分类Dev

为什么合格的名称查找会找到无作用域的枚举器?

来自分类Dev

C ++ 11使用合格名称访问无作用域枚举器

来自分类Dev

如何使用无作用域枚举器,就像其类型是其基础类型一样

来自分类Dev

C ++ 11使用合格名称访问无作用域枚举器

来自分类Dev

如何实现具有IsFirst和IsLast函数的枚举器?

来自分类Dev

通过作用域和类型化的枚举访问元组值失败

来自分类Dev

如何在引用int和作用域枚举之间进行static_cast?

来自分类Dev

Python:修饰器,作用域和模块导入

来自分类Dev

角度控制器(和作用域)继承如何工作

来自分类Dev

将作用域枚举转换为int

来自分类Dev

样式和枚举器

来自分类Dev

角度:作用域变量与函数

来自分类Dev

如何访问作用域函数

Related 相关文章

热门标签

归档