C#的yield关键字
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Linq; namespace Test
{
//C#的yield关键字由来以久,如果我没有记错的话,应该是在C# 2.0中被引入的。
//相信大家此关键字的用法已经了然于胸,很多人也了解yield背后的“延迟赋值”机制。
//但是即使你知道这个机制,你也很容易在不经意间掉入它制造的陷阱。
//
//对于上面的现象,很多人一眼就可以看出这是由于yield背后的“延迟赋值”机制导致,
//但是不可否认我们会不经意间犯这种错误。为了让大家对这个问题有稍微深刻的认识,
//我们还是简单来谈谈“延迟赋值”。延迟赋值(Delay|Lazy Evaluation)又被称为延迟计算。
//为了避免不必要的计算导致的性能损失,和LINQ查询一样,yield关键字并不会导致后值语句的立即执行,
//而是转换成一个“表达式”。只有等到需要的那一刻(进行迭代)的时候,表达式被才被执行。
class Program
{
static void Main(string[] args)
{
IEnumerable<Vector> vectors = GetVectors(); foreach (var vector in vectors)
{
vector.X = ;
vector.Y = ;
} //赋值没成功 还是输出原来的结果
//从运行后的结过我们可以看出,Vector对象被创建了6次,来自于两次迭代。
//一次是对Vector元素的重新赋值,另一次源自对Vector元素的输出。
//由于两次迭代造作的并不是同一批对象,才会导致X和Y属性依然“保持”着原始的值。
foreach (var vector in vectors)
{
Console.WriteLine(vector);
} Console.WriteLine("分割线-------------------------------------------"); IEnumerable<Vector> vectorsNow = GetVectors().ToList();
foreach (var vector in vectorsNow)
{
vector.X = ;
vector.Y = ;
}
foreach (var vector in vectorsNow)
{
Console.WriteLine(vector);
} Console.ReadLine();
} static IEnumerable<Vector> GetVectors()
{
yield return new Vector(, );
yield return new Vector(, );
yield return new Vector(, );
}
} public class Vector
{
public double X { get; set; }
public double Y { get; set; }
public Vector(double x, double y)
{
Console.WriteLine("构造函数");
this.X = x;
this.Y = y;
} public override string ToString()
{
return string.Format("X = {0}, Y = {1}", this.X, this.Y);
}
}
}

C#的yield关键字的更多相关文章
- 从yield关键字看IEnumerable和Collection的区别
C#的yield关键字由来以久,如果我没有记错的话,应该是在C# 2.0中被引入的.相信大家此关键字的用法已经了然于胸,很多人也了解yield背后的“延迟赋值”机制.但是即使你知道这个机制,你也很容易 ...
- .NET中的yield关键字
浅谈yield http://www.cnblogs.com/qlb5626267/archive/2009/05/08/1452517.html .NET中yield关键字的用法 http://bl ...
- 使用yield关键字让自定义集合实现foreach遍历
一般来说当我们创建自定义集合的时候为了让其能支持foreach遍历,就只能让其实现IEnumerable接口(可能还要实现IEnumerator接口) 但是我们也可以通过使用yield关键字构建的迭代 ...
- 从range和xrange的性能对比到yield关键字(中)
上节提出了range和xrange的效率问题,这节我们来探究其中的原因 yield的使用 我们看下面的程序: #coding: utf-8 def test(): print 4 print ...
- (转) Python Generators(生成器)——yield关键字
http://blog.csdn.net/scelong/article/details/6969276 生成器是这样一个函数,它记住上一次返回时在函数体中的位置.对生成器函数的第二次(或第 n 次) ...
- 转载yield关键字理解
实现IEnumerable接口及理解yield关键字 [摘要]本文介绍实现IEnumerable接口及理解yield关键字,并讨论IEnumerable接口如何使得foreach语句可以使用. 本 ...
- yield关键字的用法
在上一篇文章中,说了下foreach的用法,但是还是比较复杂的,要实现接口才能进行遍历,有没有简单些的方法呢?答案是肯定的.且看下面. yield关键字的用法: 1.为当前类型添加一个任意方法,但是要 ...
- yield 关键字和迭代器
一般使用方法 yield 关键字向编译器指示它所在的方法是迭代器块 在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值. 这是一个返回值,例如,在 forea ...
- C# 基础小知识之yield 关键字 语法糖
原文地址:http://www.cnblogs.com/santian/p/4389675.html 对于yield关键字我们首先看一下msdn的解释: 如果你在语句中使用 yield 关键字,则意味 ...
随机推荐
- [codeforces 360]A. Levko and Array Recovery
[codeforces 360]A. Levko and Array Recovery 试题描述 Levko loves array a1, a2, ... , an, consisting of i ...
- iOS网络学习之“远离NSURLConnection 走进NSURLSession”
目前,在iOS的开发中,NURLConnection已经成为了过去式,现在的NSURLConnection已经deprected(iOS7之后),取而代之的是NSURLSession.而且AFNetw ...
- 本科小白学ROS 和 SLAM(一):杂谈
本人最近才迷恋上ROS(Robot Operating System),准确的说应该是6月中旬,具体的记不清了(可能是年纪大了,容易健忘).对于一个电子DIY的狂热爱好者来说,我在校的梦想就是做一个属 ...
- qt-5.6.0 移植之实现板子与ubuntu主机通过网络进行文件传输
经过一上午的调试以及同事的帮助,终于实现板子与主机的文件传输. 第一步关闭所有的防火墙 在 Windows 里面是在控制面板->安全->Windows 防火墙->自定义设置 在ubu ...
- SVN迁移到Git的过程(+ 一些技巧)
SVN迁移到Git的过程(+ 一些技巧) 李顺利 Key Words SVN,Git,Clone,Conversion,Tips,VCS,Pro Git 关于在VCS中SVN和Git之间的迁移(Clo ...
- ja
import java.util.*; class animal{ void cry(){ } void get_animal_name(){ ...
- 百度云+ KeePass 网络同步你的密码
百度云+ KeePass 网络同步你的密码 百度云一个目前不限流量不限格式能直链的网盘,速度在我这里很快,难得了!KeePass(小众介绍过 KeePass.) 是一个免费开源的密码管理类软件, ...
- struts2类型转换器、 类型转换错误 以及INPUT view
1.1.1 Struts2中的类型转换器 Struts2内置了常见数据类型多种转换器 boolean 和 Boolean char和 Character int 和 Integer long 和 ...
- centos7.0改变用户创建目录组权限
centos7.0改变用户创建目录组权限可通过umask进行设置. 临时改变可通过umask命令进行设置 永久性改变,可通过修改~/.bash_profile的方式进行调整.
- hdu2196
基本的树形dp,需要dfs三次,第一次求每个点最远的后代,第二次和第三次每个点的孩子分别从左到右和从右到左遍历. #include <cstdio> #include <vector ...