问题记录

Posted EasonDongH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问题记录相关的知识,希望对你有一定的参考价值。

迭代变量

为什么foreach迭代变量不能修改值?我知道是在实现IEnumerator枚举器的时候Current属性设置为只读,但是问题是为什么将其设置为只读属性呢?而且在自定义实现该枚举器的时候,将其设置为读写的,还是会提示迭代变量不可更改,就是说foreach强行限制不允许迭代变量赋值,为什么要这样做?

目前我只能这样解释:foreach迭代变量每次都会去迭代当前变量地址,获取下一变量地址,如果给当前变量更新了值,地址就会变,foreach迭代就会出错。

这样的解释很牵强,希望有大神帮忙解释一下!同时也想多了解一下迭代的更多知识!

自定义foreach

技术分享图片
using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Spectrum spec = new Spectrum();
            foreach (var item in spec)
            {
                item = item + "123";//出错:迭代变量
                Console.WriteLine(item);
            }
        }
    }

    class ColorEnumerator : IEnumerator
    {
        string[] _colors;
        int position = -1;

        public ColorEnumerator(string[] colors)
        {
            _colors = new string[colors.Length];
            for(int i=0;i<_colors.Length;i++)
            {
                _colors[i] = colors[i];
            }
        }

        public object Current
        {
            get
            {
                if (position < 0 || position >= _colors.Length)
                    throw new InvalidOperationException();
                else
                    return _colors[position];
            }
            set//增加写
            {
                if (position < 0 || position >= _colors.Length)
                    throw new InvalidOperationException();
                else
                    _colors[position] = (string)value;
            }
        }

        public bool MoveNext()
        {
            if (position >= _colors.Length-1)
                return false;
            else
            {
                position++;
                return true;
            }
        }

        public void Reset()
        {
            position = -1;
        }
    }

    class Spectrum : IEnumerable
    {
        string[] colors = { "violet", "blue", "cyan", "green", "yellow", "orange", "red" };
        public IEnumerator GetEnumerator()
        {
            return new ColorEnumerator(colors);
        }
    }
}
View Code

 

以上是关于问题记录的主要内容,如果未能解决你的问题,请参考以下文章

记录C#常用的代码片段

[未解决问题记录]python asyncio+aiohttp出现Exception ignored:RuntimeError('Event loop is closed')(代码片段

discuz X3.1 源代码阅读,记录代码片段

提效小技巧——记录那些不常用的代码片段

ElasticSearch学习问题记录——Invalid shift value in prefixCoded bytes (is encoded value really an INT?)(代码片段

Sphinx - 在代码块片段中使用省略号 (...)