标签:
原文章 : http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html
一、11个与LINQ有关的语言特性 1. 隐式类型 var num = 1; 2. 匿名类型 var obj = new {id=1,name="aa"}; 3. 自动属性 public string Title {get; set;} 4. 对象初始化器 var myObj = new MyObj(){id=1, name="aa"}; 5. 委托:委托是一种类型 delegate bool MoreOrLessDelgate(int item); 委托类型,和类是一个级别的,它定义了某种方法规范。 委托对象,和对象是同级别的,它指向某个方法。 委托对象在使用时,实际上调用的是它指向的方法。 6. 泛型:避免装箱拆箱操作时的类型转化的性能损耗。 预定义的泛型类型 List<T> Dictionary<TKey, TValue> 自定义泛型类型 public class SomeFac<T> { public T(); public static T Instance() { return default(T); } } 自定义泛型类型时的泛型约束 public class SomeFac<T> where T: myObj public class SomeFac<T> where T: myObj, new() //必须有一个构造函数 7. 泛型委托 预定义的三种泛型委托 public delegate bool Predicate<in T>(T obj);//传入一个T类型的参数,返回bool类型的值 public delegate void Action<in T1...T16>(T1 obj1, ..16)//传入0个到16个参数,无返回值 public delegate TResult Func<in T1...T16, TResult>(T1 obj1, ..16)//传入0个到16个参数,返回一个T类型值 8. 匿名方法:delegate (int item){方法体}; var print = new Action<int>(delegate(int a){Console.WriteLine(a);}); 其中,匿名方法代码如下: delegate(int a){Console.WriteLine(a);} 9. Lambda表达式:匿名方法的简化写法 delegate(int a){Console.WriteLine(a);} 更改为: a=>Console.WriteLine(a);//a的类型由编译器自动推断 var print = new Action<int>(delegate(int a){Console.WriteLine(a);}); 简写为: var print = new Action<int>(a=>Console.WriteLine(a)); =>是lambda操作符 Console.WriteLine(a)是要执行的语句。 如果是多条语句的话,可以用{}包起来。 如果需要返回值的话,可以直接写return语句 10. 扩展方法 想给一个类型增加行为,通常是通过继承的方式实现。 新的方式是使用扩展方法。 public static void PrintString(this String val) { Console.WriteLinie(val); } 之后,则可以这样调用。 var a = "aaa; a.PrintString(); 本来string类型没有PrintString方法。 但通过我们上面的代码,就给string类型"扩展"了一个PrintString方法 (1)先决条件 <1>扩展方法必须在一个非嵌套、非泛型的静态类中定义 <2>扩展方法必须是一个静态方法 <3>扩展方法至少要有一个参数【这个参数的类型就是增加行为的类型】 <4>第一个参数必须附加this关键字作为前缀 <5>第一个参数不能有其他修饰符(比如ref或者out) <6>第一个参数不能是指针类型 (2)注意事项 <1>跟前面提到的几个特性一样,扩展方法只会增加编译器的工作,不会影响性能(用继承的方式为一个类型增加特性反而会影响性能) <2>如果原来的类中有一个方法,跟你的扩展方法一样(至少用起来是一样),那么你的扩展方法奖不会被调用,编译器也不会提示你 <3>扩展方法太强大了,会影响架构、模式、可读性等等等等.... 11. 迭代器 每次针对集合类型编写foreach代码块,都是在使用迭代器 这些集合类型都实现了IEnumerable接口,都有一个GetEnumerator方法。 static IEnumerable<int> GetIterator() { Console.WriteLine("迭代器返回了1"); yield return 1; Console.WriteLine("迭代器返回了2"); yield return 2; Console.WriteLine("迭代器返回了3"); yield return 3; } yield 关键字,在迭代器块中用于向枚举数对象提供值或发出迭代结束信号。 注意事项 <1>做foreach循环时多考虑线程安全性 在foreach时不要试图对被遍历的集合进行remove和add等操作 任何集合,即使被标记为线程安全的,在foreach的时候,增加项和移除项的操作都会导致异常 (我在这里犯过错) <2>IEnumerable接口是LINQ特性的核心接口 只有实现了IEnumerable接口的集合 才能执行相关的LINQ操作,比如select,where等 这些操作,我们接下来会讲到。
标签:
原文地址:http://www.cnblogs.com/liuweitoo/p/4305077.html