C# in Depth阅读笔记2:C#2特性
2015-01-09 00:51 cgs 阅读(160) 评论(0) 编辑 收藏 举报
1.方法组转换
c#2支持一个从方法组到兼容委托类型的隐式转换,即如:
button.click+=new eventhandler(logevent)可以写成
button.click+=logevent。
2.匿名函数的闭包和捕获外部变量
闭包:执行一段代码所需要的上下文。
被捕获的外部变量:在匿名方法内部使用的外部变量。被捕获的是变量本身,而不是变量的值。
在此这段代码即匿名方法。
被捕获的外部变量不存储在栈上,而是创建一个额外的类来容纳(this除外)。
循环外部的captured variable被实例化一次,而在循环内部实例化各自的captured variable(C#5中循环外部的captured variable也被分别实例化)。
3.泛型
类型约束:
引用类型约束:where T : class
值类型约束:where T : struct
构造器约束:T : new() 用来约束拥有一个无参构造函数的类型:所有值类型,非静态非抽象没有显式构造函数的类,显式声明了无参构造函数的非抽象类
转换类型约束:类型实参必须可以通过某种方式隐式转换为该约束类型(类型参数约束:一个类型可以隐式转换为另一类型class Sample<T,U> where T : U)
类型推断只适用于泛型方法。
如果没有类型约束,==,!=可以使用,但仅限于和NULL的比较;如果被约束为值类型,则不能使用==,!=;如果是简单引用类型,则进行简单的比较;如果被约束了派生自冲在了==和!=的类型,这些重载将被调用(如果类型参数本身也实现重载,这种重载并不会被调用,因为编译器对此一无所知,编译器在编译未绑定的泛型类型时就解析好了所有函数重载)。
四种泛型比较接口:
IComparer<T>、IComparable<T>用来排序(判断大于小于等于),IEqualityComparer<T>、IEquatable<T>用来判断相等性;
IComparer<T>、IEqualityComparer<T>用来比较两个值,IComparable<T>、IEquatable<T>用来比较其它值与它自身。
4.迭代器
首先执行MoveNext();之后执行迭代器块的代码;获取Current的值不执行任何代码;执行到yield return后停止;执行下一个MoveNext(),如果返回值为false则停止迭代,否则继续,而不是在最后的yield return处结束(所以如果我们想要finally块的代码被执行,就需要一个 yield break,不过在我们直接使用foreach时不会遇到这个问题,因为foreach最后会调用一个Dispose(),而这会触发finally的执行)。