C#基础之Foreach

     下面是Foreach的介绍。

     如何让一个类可以用Foreach来遍历呢。

     结论:让这个类实现IEnumerable接口。

     这个类有一个public的GetEnumerator的实例方法,并且返回类型中有public 的bool MoveNext()实例方法和public的Current实例属性。

     

 public class Car {
        private string _name;
        private double _capacity; //汽车排量

        public string Name { get {
                return this._name;
            }
            set {
                //忽然想到这个value指代的是啥
                this._name = value;
            }
        }

        public double Capacity {
            get {
                return this._capacity;
            }
            set {
                this._capacity = value;
            }
        }


        public Car(string name,double capacity) {
            this._capacity = capacity;
            this._name = name;
        }
    }

  

    public class MyTest {
        Car[] carArray = new Car[4];
        public MyTest() {
            carArray[0] = new Car("221",101);
            carArray[1] = new Car("222", 102);
            carArray[2] = new Car("223", 103);
            carArray[3] = new Car("224", 104);
        }
    }

      看到这里我们可能会想到可以这么做

      MyTest test=new MyTest();

      foreach(var i in test)... 确定这样可行吗?

      经过测试,我们知道上面是不可行的,错误提示:该命名空间下没有公共的GetEnumerator()定义。

     为了解决这个错误,我们做了如下:

     根据错误提示可以知道,他需要公共的GetEnumerator();所以我给他加了个公共的GetEnumerator();

   public class MyTest {
        Car[] carArray = new Car[4];
        public MyTest() {
            carArray[0] = new Car("221",101);
            carArray[1] = new Car("222", 102);
            carArray[2] = new Car("223", 103);
            carArray[3] = new Car("224", 104);
        }

        /// <summary>
        /// 通过这个例子,可以明白了很多东西呀。
        /// </summary>
        /// <returns></returns>
        public IEnumerator GetEnumerator() {
            return this.carArray.GetEnumerator();
        }
    }

  经过测试刚好可行,再继续测试可以得到上面的结论二,这里只是因为数组本来里面就实现了moveNext方法和current;

      还有一种方法是:直接实现IEnumerable接口,道理也是一样的。

      上下文关键字 value 用在普通属性声明的 set 访问器中。 此关键字类似于方法的输入参数。 关键字 value 引用客户端代码尝试赋给属性的值。

      顺带提一下value这个东东

private int _num
public int num
{ 
    get 
    {
        return _num;
    }
    set(int value)  //其实value就是类似于一个参数传递过来
    {
        _num=value;
    }
}

  

     

     

   

    

原文地址:https://www.cnblogs.com/gdouzz/p/6687525.html