前言
放了一个长假很是郁闷休息没休息好学习没学上玩也没怎么玩……这天怎么就没了?
哎看来人生没计划没安排就会混混沌沌的过一天又一天都不知道自己到底在干嘛这样下去只会一事无成!计划好每一天的工作学习生活或者安排好每一件事情每一个目标的计划对取得成功还是非常有帮助的!
匿名函数
//匿名函数
var p = new {Name=张三Age=}
var p = new {Name=李四Age=}
var intArr = new[] {}
首先我们来看一下上面这段代码比较简单和我们平时定义一个实例基本没什么区别只是new后面没有跟具体定义的类型 这里我们使用new关键字调用匿名初始化器创建了一个匿名类型对象 匿名类型直接继承自SystemObject 匿名类型的成员是编译器根据初始化器推断而来的一些读写属性
这里我们注意到匿名函数基本上是配合隐式类型var来使用的而且定义的顺序也是一定要注意上面p和p初始化时定义的属性名类型和顺序一致因此编译器认为他们是同一个类型可以使用p=p这样的赋值语句特别是顺序需要注意如果初始化时名称类型一致而顺序不一致则p和p就是两个类型如果使用p=p则编译时会抛出错误 无法将类型AnonymousType#隐式转换为AnonymousType# 定义匿名函数时还需要注意不能用null赋初始值
匿名函数解析匿名函数的基础是对象初始化器匿名类型从对象初始化器(object initializer)自动推断和生成的元组类型下面我们来看看匿名函数到底怎么生成的和我们原来的定义方式有什么区别var p = new {Name=张三Age=} 我们给p赋了一个匿名类型在编译时编译器使用对象初始化器推断的属性来创建见一个新的匿名类型该类型拥有Name和Age的属性在运行时会创建新类型的一个实例同时Name和Age属性将会被设置为对象初始化器中指定的值张三和上面几节里描述的一样这里大家一定会想到肯定又是在编译器里封装了一些处理确实是这样下面这段代码描述编译器针对匿名函数语句具体做了哪些工作
class __Anonymous
{
private string name
private int age
public string Name{get{return name } set{name=value }}
public int Age{get{return age } set{age=value }}
}
__Anonymous p = new __Anonymous()
pName=张三
pAge=
这段代码就是我们非常熟悉的写法编译器就是在后台依据匿名函数解析类型创建新类初始化对象如果你创建了多个相似的匿名类型C#编译器会聪明的发现这一点只生成一个类和它的多个实例小结匿名函数多数是和var隐式类型一起使用因此多在局部(方法内部)内使用同样匿名函数是编译器编译时创建内部实现与我们原来的写法没有本质区别