分享

c# 链式编程

 goodwangLib 2018-02-15

先写一段代码,让大家了解或重温一下什么是链式编程:

C#代码
  1. ///   
  2.         /// EntityFramwork中的链式编程示例  
  3.         ///   
  4.         private void Example1()  
  5.         {  
  6.             using (NorthwindEFEntities northwindEFEntities = new NorthwindEFEntities())  
  7.             {  
  8.                 northwindEFEntities.Employees  
  9.                     .Where(e => e.FirstName.StartsWith('C'))  
  10.                     .Select(e => e.FirstName)  
  11.                     .OrderBy(s => s);  
  12.             }              
  13.         }  
/// /// EntityFramwork中的链式编程示例 /// private void Example1() { using (NorthwindEFEntities northwindEFEntities = new NorthwindEFEntities()) { northwindEFEntities.Employees .Where(e => e.FirstName.StartsWith('C')) .Select(e => e.FirstName) .OrderBy(s => s); } }

 这一个基本的查询,执行了三个操作:1.查找FristName以C开头的员工;2.取员工的FirstName;3.将名字排序。

EF中只需要一个语句,通过.将三者链成一个语句。后面还可以链接更多的语句,如果需要。
下面代码作一些演化:

C#代码
  1. ///   
  2.         /// 链式编程示例2  
  3.         ///   
  4.         private static  void Example2()  
  5.         {  
  6.             Person person = new Person { Name = 'Tom' }  
  7.                 .Run()  
  8.                 .Sing()  
  9.                 .Swim();  
  10.         }  
  11.   
  12.         class Person  
  13.         {  
  14.             public string Name { getset; }  
  15.   
  16.             public Person Run()  
  17.             {  
  18.                 Console.WriteLine('Run');  
  19.                 return this;  
  20.             }  
  21.             public Person Swim()  
  22.             {  
  23.                 Console.WriteLine('Swim');  
  24.                 return this;  
  25.             }  
  26.             public Person Sing()  
  27.             {  
  28.                 Console.WriteLine('Sing');  
  29.                 return this;  
  30.             }  
  31.         }  
/// /// 链式编程示例2 /// private static void Example2() { Person person = new Person { Name = 'Tom' } .Run() .Sing() .Swim(); } class Person { public string Name { get; set; } public Person Run() { Console.WriteLine('Run'); return this; } public Person Swim() { Console.WriteLine('Swim'); return this; } public Person Sing() { Console.WriteLine('Sing'); return this; } }

 这段代码定义了Peoson类,有三个操作Run、Swim、Sing,操作完成后返回自身this(有返回值是链式编程的关键)。返回自身this好比说执行完操作先别走人,还(可能)有其它操作要去做,如Example2中:先造一个People,先命令ta跑步,跑完先别休息再唱歌,再游泳,游泳完OK了。

链式编程是将多个操作(多行代码)通过点号'.'链接在一起成为一句代码。(定义不严密,表达能力好的请给修正一下)
以下为常规代码与链式代码的比较:

C#代码
  1. ///   
  2.         /// 链式编程示例3  对比  
  3.         ///   
  4.         private void Example3()  
  5.         {  
  6.             //链式代码  
  7.             Person person = new Person { Name = 'Tom' }  
  8.                 .Run()  
  9.                 .Sing()  
  10.                 .Swim()  
  11.                 .Run()  
  12.                 .Sing()  
  13.                 .Swim();  
  14.             //常规代码  
  15.             Person person2 = new Person();  
  16.             person2.Run();  
  17.             person2.Sing();  
  18.             person2.Swim();  
  19.             person2.Run();  
  20.             person2.Sing();  
  21.             person2.Swim();  
  22.         }  
/// /// 链式编程示例3 对比 /// private void Example3() { //链式代码 Person person = new Person { Name = 'Tom' } .Run() .Sing() .Swim() .Run() .Sing() .Swim(); //常规代码 Person person2 = new Person(); person2.Run(); person2.Sing(); person2.Swim(); person2.Run(); person2.Sing(); person2.Swim(); }

 为了增强效果,都执行了两轮操作。个人感觉链式代码更加精炼简洁易读。



链式代码要求操作有返回值,但对于很多操作大都是void型,什么也不返回,这样就很难链起来了。当然也有解决办法,可能不太优雅。
本人使用扩展方法解决这个问题,首先引入一个泛型扩展:

C#代码
  1. ///   
  2.         /// 先执行操作,再返回自身  
  3.         ///   
  4.         public static T Do(this T t, Action action)  
  5.         {  
  6.             action(t);  
  7.             return t;  
  8.         }  
/// /// 先执行操作,再返回自身 /// public static T Do(this T t, Action action) { action(t); return t; }

 下面是调用示例,其中Student类操作都是void型的。

C#代码
  1. ///   
  2.         /// 链式编程示例4  
  3.         ///   
  4.         private static void Example4()  
  5.         {  
  6.             new Student { Name = 'Tom' }  
  7.                 .Do(s => s.Run())  
  8.                 .Do(s => s.Sing())  
  9.                 .Do(s => s.Sing())  
  10.                 .Do(s => s.Name = 'Bob');  
  11.         }  
  12.   
  13.         public class Student  
  14.         {  
  15.             public string Name { getset; }  
  16.             public void Run() { Console.WriteLine('Run'); }  
  17.             public void Swim() { Console.WriteLine('Swim'); }  
  18.             public void Sing() { Console.WriteLine('Sing'); }  
  19.         }  
/// /// 链式编程示例4 /// private static void Example4() { new Student { Name = 'Tom' } .Do(s => s.Run()) .Do(s => s.Sing()) .Do(s => s.Sing()) .Do(s => s.Name = 'Bob'); } public class Student { public string Name { get; set; } public void Run() { Console.WriteLine('Run'); } public void Swim() { Console.WriteLine('Swim'); } public void Sing() { Console.WriteLine('Sing'); } }

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多