最近在升级软件版本,升级是一件让我非常头疼的事情,里面太过于复杂,每次都得要重新理一次,自己也不得不承认自己的设计不合理,后来读了一些设计模式的文章觉得受益匪浅,设计模式是软件的灵魂所在,精华的总结,很长一段时间自己在看别人源码的时候什么bll,DAL,之类的文件夹,当时很不解为什么要这么做,尽管自己也去用一些比如数据库多支持之类的类,为什么人家用接口,当时觉得自己按照自己的想法,没必要用这些,非常遗憾过了三年自己猜领悟接口与设计模式的重要性,以及为何要用它,今天开始自己记录下自己的每日总结,并把一些经验与大家一起分享,作为一个自学者,相信会引起自学者的共鸣,欢迎大家跟我一起学设计模式,我会把自己的理解分享给大家
今天第一次阅读,还没进入正文,那先说说我对泛型和lamp表达式的一些简单的理解吧,以后写的多数都是来自设计模式一书的例子,记录出来主要1是为了自己学习的进度,2是方便自己复习
例子是最好的说明
先看一段代码
public static class EnumerableHelper { /// <summary> /// Execute Action for each element in <see cref="IEnumerable<T>"/> /// </summary> public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action) { if (sequence == null) throw new ArgumentNullException("sequence"); if (action == null) throw new ArgumentNullException("action"); foreach (var item in sequence) action(item); } }
这是来自设计模式一文作者的部分源码
首先这个类定义了一个泛型方法,需要 using System.Linq;
有了这个之后,它像什么呢,像http://bbs.csdn.net/topics/390162519这篇文章里面的扩展类的使用,其实我理解是一个道理
using System; using System.Windows.Forms; namespace WindowsFormsApplication1 { public static class Extensions { public static void SafeCall(this Control ctrl, Action callback) { if (ctrl.InvokeRequired) ctrl.Invoke(callback); else callback(); } } }
这样子,那么调用时候点一下就有
label1.SafeCall(() => { label1.Text = i.ToString(); });
其实他对Ctrol做了一个扩展,你可以把Control是所有控件泛型一样,这里定义了一个泛型之后,那么所有类型都会具备这么个方法了,于是乎我们就有了这样的调用
string[] data = { "A", "B", "CDE", "FG" }; int[] lens = new int[data.Length]; int i = 0; //第一种用法,对于泛型可以支持所有,所以它也会有这样的扩展 data.ForEach( delegate(string item) { lens[i++] = item.Length; Trace.WriteLine(lens[i - 1]); });
如果我按照以前的思维调用是
EnumerableHelper.ForEach<string>(data, delegate(string item) { lens[i++] = item.Length; Trace.WriteLine(lens[i - 1]); });
那么再看,其实泛型经常与lamp表达式搭配
怎么改写成lamp表达式
data.ForEach( t => { lens[i++] = t.Length; Trace.WriteLine(lens[i - 1]); } );
或者
data.ForEach(
(t) => { lens[i++] = t.Length; Trace.WriteLine(lens[i - 1]); }
);
其实是一个道理,很少写文章,我表达的意思不知道大家可否看得明白
另外给大家说一个关键字params这个我平时用的比较少,今天也算遇到,我想或许以后数据库操作参数一类会用到或者自己扩展,其实这个参数我估计大家都遇到过,就是在数据库通用类之类的地方相信大家估计只用却很少留意
它的意思是
params 构造函数声明数组 而不知道数组长度 用的
在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
也就是不固定参数,也就是说 参数的维数不固定,你想几个,就可以几个,
在获取参数的地方也相应读取的就可以了
例如
public static void UseParams2(params object[] list) { for (int i = 0 ; i < list.Length; i++) { Console.WriteLine(list[i]); } Console.WriteLine(); }
调用就是
UseParams2(1, 'a', "test");
public static void UseParams(params int[] list) { for (int i = 0 ; i < list.Length; i++) { Console.WriteLine(list[i]); } Console.WriteLine(); }
调用就是
UseParams(1, 2, 3);