C#迭代器、装箱/拆箱、重载等

迭代器

迭代器是什么?

迭代器是作为一个容器,将要遍历的数据放入,通过统一的接口返回相同类型的值。

为什么要用迭代器?

为何了为集合提供统一的遍历方式,迭代器模式使得你能够获取到序列中的所有元素而不用关心是其类型,如果没有迭代器,某些数据结构遍历较为困难,如Map无法迭代

如果一个类实现了IEnumerable接口,那么就能够被迭代,才能使用foreach

迭代器概述

  • 迭代器是可以返回相同类型的值的有序序列的一段代码。
  • 迭代器可用作方法、运算符或 get 访问器的代码体。
  • 迭代器代码使用 yield return 语句依次返回每个元素。yield break 将终止迭代。
  • 可以在类中实现多个迭代器。每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在 foreach 语句中被客户端代码调用,如下所示:foreach(int x in SampleClass.Iterator2){}
  • 迭代器的返回类型必须为 IEnumerableIEnumeratorIEnumerable<T> 或 IEnumerator<T>。

yield 关键字用于指定返回的值。到达 yield return 语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行

如何使用迭代器

 

public System.Collections.IEnumerator GetEnumerator()
{
    for (int i = 0; i < max; i++)
    {
        yield return i;
    }
}

 

  

//为整数列表创建迭代器 
public class SampleCollection{
        public int[] items = new int[5] { 5, 4, 7, 9, 3 };
        public System.Collections.IEnumerable BuildCollection() {
            for (int i = 0; i < items.Length; i++) {
                yield return items[i];
            }
        }
    }
class Program {
        static void Main(string[] args) {
            SampleCollection col = new SampleCollection();
    foreach (int i in col.BuildCollection())//输出集合数据
            {
                System.Console.Write(i + " ");
            }
            for (;;) ;
        }
    }

 

 

类型比较

封箱和拆箱子:封箱是把值类型转换为System.Object,或者转换为由值类型的接口类型。拆箱相反。

装箱和拆箱是为了将值转换为对象

 struct MyStruct
    {
        public int Val;
    }
    class Program
    {
        static void Main(string[] args) {
    MyStruct valType1 = new MyStruct();
        valType1.Val = 1;
        object refType = valType1;
    //封箱操作,可以供传递用
        MyStruct valType2 = (MyStruct)refType;
    //访问值类型必须拆箱
        Console.WriteLine(valType2.Val);//输出1
            for (;;) ;
        }

Is运算符语法:

<operand>is<type>同类型返回true,不同类型返回false

As运算符语法:

<operand>is<type>把一种类型转换为指定的引用类型

 

运算符重载

 public class Add2 {
        public int val {
            get; set;
        }
        public static Add2 operator ++(Add2 op1) {
            op1.val = 100;//设置属性
             op1.val = op1.val + 2;
             return op1;
        }
    }
class Program {
        static void Main(string[] args) {
        Add2 add = new Add2();
        add++;
        Console.WriteLine(add.val);//输出102
            for (;;) ;
        }
    }

 

posted @ 2016-03-07 20:14  大尾巴贝贝  阅读(967)  评论(0编辑  收藏  举报