问题一:为什么数组可以使用foreach输出各元素

答:数组是可枚举类型,它实现了一个枚举器(enumerator)对象;枚举器知道各元素的次序并跟踪它们的位置,然后返回请求的当前项

问题二:不用foreach能不能遍历各元素

C#知识点-枚举器和迭代器

问题三:什么是可枚举类

答:可枚举类是指实现了IEnumerable接口的类;IEnumerable接口只有一个成员GetEnumerator方法,它返回对象的枚举器

问题四:什么是枚举器

答:实现了IEnumerator接口的枚举器包含三个函数成员:Current,MoveNext,Reset

Current是只读属性,它返回object类型的引用;

MoveNext是把枚举器位置前进到集合的下一项的方法,它返回布尔值,指示新的位置是否有效位置还是已经超过了序列的尾部;

Reset是把位置重置为原始状态的方法;

二、下面代码展示了一个可枚举类的完整示例

namespace ConsoleApplication4 2 { 3 /// <summary> 4 /// 自定义一个枚举对象 5 /// </summary> 6 class ColorEnumerator : IEnumerator 7 { 8 private string[] _colors; 9 private int _position = -1; 10 11 public ColorEnumerator(string[] arr) 12 { 13 _colors = arr; 14 for (int i = 0; i < arr.Length; i++) 15 { 16 _colors[i] = arr[i]; 17 } 18 } 19 public object Current 20 { 21 get 22 { 23 if (_position == -1) 24 { 25 throw new InvalidOperationException(); 26 } 27 if (_position >= _colors.Length) 28 { 29 throw new InvalidOperationException(); 30 } 31 return _colors[_position]; 32 } 33 } 34 35 public bool MoveNext() 36 { 37 if (_position < _colors.Length - 1) 38 { 39 _position++; 40 return true; 41 } 42 else 43 { 44 return false; 45 } 46 } 47 48 public void Reset() 49 { 50 _position = -1; 51 } 52 } 53 54 /// <summary> 55 /// 创建一个实现IEnumerable接口的枚举类 56 /// </summary> 57 class Spectrum : IEnumerable 58 { 59 private string[] Colors = { "red", "yellow", "blue" }; 60 public IEnumerator GetEnumerator() 61 { 62 return new ColorEnumerator(Colors); 63 } 64 } 65 66 class Program 67 { 68 static void Main(string[] args) 69 { 70 Spectrum spectrum = new Spectrum(); 71 foreach (string color in spectrum) 72 { 73 Console.WriteLine(color); 74 } 75 Console.ReadKey(); 76 } 77 } 78 } 79
View Code

相关文章:

  • 2021-09-10
  • 2021-05-24
  • 2022-02-08
  • 2021-09-23
  • 2021-07-02
猜你喜欢
  • 2022-12-23
  • 2021-12-05
  • 2022-12-23
  • 2022-12-23
  • 2021-12-13
  • 2022-12-23
相关资源
相似解决方案