下面是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; } }