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

迭代器原理与应用
本文详细介绍了迭代器的概念、作用及其实现方式。通过具体的代码示例,展示了如何使用迭代器来遍历不同类型的集合,同时解释了yield关键字的作用。

迭代器

迭代器是什么?

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

为什么要用迭代器?

为何了为集合提供统一的遍历方式,迭代器模式使得你能够获取到序列中的所有元素而不用关心是其类型,如果没有迭代器,某些数据结构遍历较为困难,如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 (;;) ;
        }
    }

 

转载于:https://www.cnblogs.com/feichangnice/p/5251731.html

2. 关于C#的继承,以下说法正确的是: A. C#支持多重继承 B. C#中一个类只能继承一个类 C. 子类可以继承父类的所有成员 D. 继承的关键词是'implements' \3. 虚方法抽象方法的区别是: A. 虚方法必须有实现,抽象方法没有 B. 抽象方法可以有实现,虚方法不能 C. 虚方法可以被子类重写,抽象方法不能 D. 抽象方法只能存在于抽象类中,虚方法可以存在于任何类 \4. 接口中不能包含以下哪项? A. 方法 B. 属性 C. 字段 D. 事件 \5. 关于泛型,以下说法错误的是: A. 泛型可以提高代码的重用性 B. 泛型可以用于类、接口、方法 C. 泛型类型在运行时确定 D. 泛型可以减少装箱拆箱操作 \6. 下列哪个集合类不是线程安全的? A. ArrayList B. ConcurrentBag<T> C. BlockingCollection<T> D. Hashtable \7. 使用yield return的主要目的是: A. 返回一个值 B. 定义一个迭代器块 C. 退出方法 D. 抛出异常 \8. 以下关于接口的说法,正确的是: A. 接口可以被实例化 B. 接口可以包含静态方法 C. 接口中的方法默认是publicabstract的 D. 一个类只能实现一个接口 \9. 在C#中,以下哪个关键字用于重写父类的虚方法? A. override B. new C. virtual D. sealed \10. 关于泛型约束,以下哪个约束表示类型参数必须具有无参构造函数? ​ A. where T : class ​ B. where T : struct ​ C. where T : new() ​ D. where T : base \11. 以下哪个不是C#的基本数据类型? ​ A. int ​ B. float ​ C. decimal ​ D. Int32 \12. 以下关于抽象类的说法,错误的是: ​ A. 抽象类不能被实例化 ​ B. 抽象类可以包含非抽象方法 ​ C. 抽象类必须包含至少一个抽象方法 ​ D. 抽象类可以被继承 \13. 以下关于密封类的说法,正确的是: ​ A. 密封类可以被继承 ​ B. 密封类不能被继承 ​ C. 密封类可以是抽象类 ​ D. 密封类不能有实例方法 \14. 以下关于迭代器的说法,错误的是: ​ A. 迭代器可以用于foreach循环 ​ B. 迭代器块必须返回IEnumerable或IEnumerator ​ C. 迭代器块中可以使用yield returnyield break ​ D. 迭代器块中不能有try-catch块 \15. 以下哪个接口定义了GetEnumerator方法? ​ A. IEnumerable ​ B. IEnumerator ​ C. ICollection ​ D. IList \16. 以下关于泛型方法的描述,正确的是: ​ A. 泛型方法必须在泛型类中定义 ​ B. 泛型方法不能有返回值 ​ C. 泛型方法的类型参数可以在方法名后面指定 ​ D. 泛型方法不能重载 \17. 以下关于List<T>的说法,错误的是: ​ A. List<T>可以动态调整大小 ​ B. List<T>是线程安全的 ​ C. List<T>可以通过索引访问元素 ​ D. List<T>可以包含重复元素 \18. 以下关于stringStringBuilder的说法,正确的是: ​ A. string是可变的,StringBuilder是不可变的 ​ B. string是不可变的,StringBuilder是可变的 ​ C. 两者都是可变的 ​ D. 两者都是不可变的 \19. 以下哪个关键字用于声明一个常量? ​ A. const ​ B. readonly ​ C. static ​ D. final \20. 以下关于委托的说法,错误的是: ​ A. 委托是一种类型,用于定义方法签名 ​ B. 委托可以指向静态方法或实例方法 ​ C. 委托可以指向多个方法,形成调用链 ​ D. 委托不能被继承
08-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值