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