在函数式编程中,能够把函数看做数据。函数也能够做为参数,函数还能够返回函数。好比,LINQ就是基于函数式编程的。
编程
语句式编程可能这样写:函数式编程
string result; if(value > 0) { result = "正数"; } else { result = "负数"; }
而使用函数式表达式,能够简化为:函数
var result = value > 0 "正数":"负数";
再来看一个过滤和排序的例子:spa
var i = 0; while(i < list.Count) { if(list[i] % 2 != 0) { list.RemoveAt(i); } else { ++i; } } list.Sort();
函数式编程能够写成以下:code
from x in list where x % 2 == 0 orderby x select x;
或blog
list .where(x => x % 2 == 0) .OrderBy(x => x)
可见,在LINQ中,一个表达式(函数)的返回结果做为令一个表达式(函数)的源,还能够进行多个链式。排序
好比读取远程数据。接口
void Main() { XDocument timeDoc; using(var client = new System.Net.WebClient()) { timeDoc = XDocument.Parse(client.DonwloadString("")); } var ms = Convert.ToInt64(timeDoc.Root.Attribute("time").Value) / 1000; var currentTime = new DateTime(1977,1,1).AddMilliseconds(ms).ToLocalTime(); Console.WriteLine(currentTime); }
对于using部分咱们能够提炼出一个方法。string
private XDocument GetTime() { using(var client = new System.Net.WebClient()) { return XDocument.Parse(client.DonwloadString("")); } } void Main() { var timeDoc = GetTime(); var ms = Convert.ToInt64(timeDoc.Root.Attribute("time").Value) / 1000; var currentTime = new DateTime(1977,1,1).AddMilliseconds(ms).ToLocalTime(); Console.WriteLine(currentTime); }
但,还不够。以上的GetTime方法只是对WebClient这个实现了IDisposable接口的using语句进行了封装,可不能够对全部实现IDisposable接口的类型的using语句进行封装呢?it
public static class MyDisposable { public static TResult Using<TDisposable, TResult>( Func<TDisposable> factory, Func<TDisposable, TResult> map) where TDisposable : IDisposable { using(var disposable = factory()) { return map(disposable); } } } void Main() { var time = MyDisposable .Using( () => new System.Net.WebClient(), client => XDocument.Parse(client.DownloadString("")) ) .Root .Attribute("time") .Value; var ms = Convert.ToInt64(time) / 1000; var currentTime = new DateTime().AddMilliseconds(ms).ToLocalTime(); Console.WriteLine(currentTime); }
在函数式编程中,函数返回的类型基本上另一个函数方法的源实例。