LINQ解析

posted at 2017.5.3 15:33 by 风信子

首先,我们要弄懂C#扩展方法本质。

扩展方法原则:

1、扩展方法是一个补丁的概念,在一个进程(一个程序集)的范围内,给某个类型临时加上方法。 所以扩展方法不能写在嵌套类,应该在程序集的全局区,这个程序集的顶级类中。 而且要求有二(在static类中,是一个static方法),this是它和一般的方法的区别符 。

2、扩展方法当然不能破坏面向对象封装的概念,所以只能是访问所扩展类的public成员。

3.扩展方法是静态方法,是类的一部分,但是实际上没有放在类的源代码中。

4.扩展方法所在的类也必须被声明为static。

5.C#只支持扩展方法,不支持扩展属性、扩展事件等。

6.扩展方法的第一个参数是要扩展的类型,放在this关键字的后面,告诉编译期这个方法是Money类型的一部分。

7.在扩展方法中,可以访问扩展类型的所有公共方法和属性。

两种使用方法:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace blogok  
  7. {  
  8.     static class ExtendMethod  
  9.     {  
  10.         public static void fun(this string s)  
  11.         {  
  12.             Console.WriteLine(s);  
  13.         }  
  14.     }  
  15.   
  16.     class Program  
  17.     {  
  18.         #region 1  
  19.           
  20.   
  21.         static void Main(string[] args)  
  22.         {  
  23.             string s = "okokok";  
  24.             s.fun();  
  25.             //ExtendMethod.fun(s);  
  26.         }  
  27.         #endregion    
  28.     }  
  29. }  

 

使用s.fun();这种形式调用,更能体现扩展的意味 使用ExtendMethod.fun(s);这种形式调用,则更能体现扩展方法实现的本质,便于理解为什么是只能访问锁扩展类型的public成员。 至于顶级类中、static类、static方法的规定,这是设计如此,应用在个程序集的范围中,添加新的设计,当然可以在一个类的范围内实现临时扩展,技术上是可行的只是意义不大。

 LINQ的实现正是基于扩展方法。

实现原理为: 在一个基类上进行扩展,一般而言扩展方法单独地建立一个命名空间,在使用的时候,导入这个命名空间,则开启了扩展方法的可见性,这个时候,所有子类便可以使用这个扩展方法了(因为子类继承了基类,public,static这样的权限级别更是很容易的满足直接调用)

如此,便不难理解LINQ。  (编辑自风信子)

Tags: , ,

IT技术

添加评论

  Country flag

biuquote
  • 评论
  • 在线预览
Loading