标签:数组 为什么 this http set void size 很多 string
C#中的迭代器封装在IEnumerable和IEnumerator和他们的泛型接口中。
IEnumerable:定义了一个可以获取IEnumerator的方法---GetEnumerator()。
//IEnumerable的代码实现
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
IEnumerator:则在目标序列上实现循环迭代,直到不再需要数据。常见的foreach循环就是使用这个接口
//IEnumerator的代码实现
public interface IEnumerator
{
/// <summary>
/// 获取当前的项(只读属性)
/// </summary>
object Current { get; }
/// <summary>
/// 将游标的内部位置向前移动
/// </summary>
/// <returns>是否成功</returns>
bool MoveNext();
/// <summary>
/// 将游标重置到第一个成员前面
/// </summary>
void Reset();
}
但是为什么会有两个接口呢?为什么不直接让IEnumerable实现所有方法呢?
为了不违背单一职责原则。如果有几个嵌套的foreach循环,那么彼此就可能会收到影响了。
C#中的数组和集合都是继承了IEnumerable接口的,所以我们可以直接使用。
static void Main(string[] args)
{
int[] arr = new int[5] { 12, 65, 749, 16, 49 };
//foreach (int item in arr)
//{
// Console.WriteLine(item);
//}
#region 和上面的foreach相同
IEnumerator e = arr.GetEnumerator(); //获取要迭代的对象
while (e.MoveNext()) //一个一个的读取元素,读取完会返回false
{
Console.WriteLine(e.Current); //输出读取内容
}
#endregion
}
自定义类中使用迭代器。
/// <summary>
/// 动物园类,里面有很多动物
/// </summary>
public class Zoo : IEnumerable
{
Animal[] animals = new Animal[3];
public Zoo()
{
animals[0] = new Animal("张三");
animals[1] = new Animal("李四");
animals[2] = new Animal("赵五");
}
public IEnumerator GetEnumerator()
{
return this.animals.GetEnumerator();
}
}
/// <summary>
/// 动物类,每个动物有其名字
/// </summary>
public class Animal
{
private string name;
public string Name { get { return name; } }
public Animal(string name)
{
this.name = name;
}
}
static void Main(string[] args)
{
Zoo zoo = new Zoo();
//可以直接使用foreach迭代
foreach (Animal animal in zoo)
{
Console.WriteLine(animal.Name);
}
Console.ReadKey();
}
进程:
线程:
协程:
Unity的协程系统是基于C#的一个简单而强大的接口 ,IEnumerator。
详细请看大佬:
https://blog.csdn.net/huang9012/article/details/38492937
标签:数组 为什么 this http set void size 很多 string
原文地址:https://www.cnblogs.com/Fflyqaq/p/12909866.html