迭代器

迭代器是什么?

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

为什么要用迭代器?

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

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

迭代器概述

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

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);//输出102for (;;) ;}}

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

C#迭代器、装箱/拆箱、重载等相关推荐

  1. CLR via C# 中关于装箱拆箱的摘录

     装箱: 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(boxing)的机制.下面总结了对值类型的一个实例进行装箱操作时在内部发生的事情. 1.在托管堆中分配好内存.分配的内存量是值类型的各 ...

  2. java装箱拆箱_Java中的自动装箱与拆箱

    自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象.自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接. 如 ...

  3. 为什么需要java包装类,装箱拆箱,基本类型与字符串之间的转换,java数据类型

    为什么需要包装类? 首先,Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,将每个基本数据类型设计一个对应的类进行代表,这种方式增强了Java面向对象的性质. 其次,如果 ...

  4. Java自动装箱/拆箱 - Java那些事儿

    昨天Java基本数据类型和引用类型一文中漏了几张图,已经补上,需要的自己回头去看,本系列文章首发于公众号:saysayJava. 在让人疑惑的Java代码 - Java那些事儿 一文中我们说到编译器自 ...

  5. C#装箱,拆箱和强制转换(转)

    出处:https://www.cnblogs.com/fengjiulin110120/p/6605739.html 关系: 强制转换就包含有装箱拆箱操作,装箱就是把值类型转换成引用类型,反之就是拆箱 ...

  6. .Net装箱拆箱编程实例

    .Net装箱拆箱编程实例 一 装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型. 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来. ...

  7. Java基础笔记 – 增强的for循环For each循环 自动装箱拆箱 可变参数

    1.For each循环:1.1.语法:1.2.For each循环的使用:1.3.嵌套For each循环:1.4.三种循环遍历集合的列举:1.5.增强的for循环的缺点:2.自动装箱/拆箱(Aut ...

  8. 6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱

    引言 本篇文章主要介绍.NET中6个重要的概念:栈,堆,值类型,引用类型,装箱,拆箱.文章开始介绍当你声明一个变量时,编译器内部发生了什么,然后介绍两个重要的概念:栈和堆:最后介绍值类型和引用类型,并 ...

  9. java(17) - 增强for循环、装箱拆箱、可变参数

    一.增强型for循环: 语法格式: 打印: A B C D E 当遍历集合或数组时,如果需要访问集合或数组的下标时,最好使用旧的方法来便利或循环,而不要用增强型for循环,因为它丢失了下标信息. 对于 ...

  10. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法?

    参考:http://blog.csdn.net/mazhimazh/article/details/16799925 1. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法? 原始类型 ...

最新文章

  1. docker 上传到自己的容器
  2. node-webkit教程(16)调试typescript
  3. 枚举类的使用-使用实例域来替代序数
  4. 微机原理换行代码_微机原理实验保留最长行输入字符的程序
  5. 混凝土静力受压弹性模量试验计算公式_【小马建考干货】天天送检,你知道混凝土试块检测哪些性能标指吗?...
  6. P6+架构技术揭秘:Redis+Nginx+Dubbo精选+面试题+架构师精选视频(送)
  7. 工程师与项目经理之间差距何在?
  8. 用eclipse无法打开html里用绝对路径添加的图片但是在外面可以打开的解决方法
  9. 金蝶BOS系统dep无法扩展,如何增加白名单使其能够继续扩展
  10. 遥感数字图像融合算法简介
  11. overleaf表格_latex插入表格心得
  12. netbeans 8 java自动提示_Netbeans 代码提示
  13. 新一代至强CPU加速GBase 8a MPP,GBase GCDW云数据仓库助力行业迎接数字化转型新挑战
  14. 微信开发者工具 设置wxml属性换行
  15. 转行做程序员到底可不可行?转行前先考虑好以下几点
  16. 即时通讯 SDK 一对一通讯技术
  17. 0427-android-距离感应了解一下
  18. Web(一)Web前端开发概述
  19. C++文件操作——fopen/fseek/ftell/fread/fwrite/fclose等函数用法
  20. ABP VNext学习日记21

热门文章

  1. Android存储系统之架构篇
  2. BZOJ 3720 [洛谷P2137] : Gty的妹子树
  3. python迅雷sdk_Python anthunder包_程序模块 - PyPI - Python中文网
  4. 魅蓝android底层是什么,集体去YunOS化:魅蓝2\魅蓝Metal更换安卓底层
  5. controller层没反应_埋地管道防腐层探测检漏仪FJ-10地下管线探测仪的说明及应用...
  6. BZOJ-2716-天使玩偶angel-CDQ分治
  7. CVPR 2019 ATOM:《ATOM: Accurate Tracking by Overlap Maximization》论文笔记
  8. CVPR 2017 CFNet:《End-to-end representation learning for Correlation Filter based tracking》论文笔记
  9. hihoCoder #1384 : Genius ACM [枚举+倍增]
  10. 排队接水pascal程序