泛型 Generic - 即通用类型
------------------------------------
C#是强类型语言,在享受强类型带来的诸多好处的同时你必须在逻辑设计的同时顾及类型(type),即便你可以通过把对象boxing成object来将相同逻辑的方法、列表对象或delegate抽象出来,但你不得不考虑在使用他们时的unboxing或强制转换,而这会带来一些性能的负担和潜在的风险。籍此,C#2.0后引入了Generic(泛类型,通用类型),也就是把类型(type)设置成未知数T,这样就可以在书写逻辑的时候忽略Type只关注
逻辑,在具体调用的时候再指定这个T。这样一来不但加大了代码的重用性而且还能保证这些方法、列表、delegate等是强类型的,没有了boxiing/unboxing和强制转换,一切就这么完美了(或者说趋于完美了)。
有了泛型(Generic)List<T>,Func<TResult>...,Action<>.... 看起来就很自然,而利用这三个东西设计出来的框架就狂简炼狂强大,比如LINQ。List<T>没啥好说的,算是凑数的,Func<TResult>和Action<>为我们固化了两类方法的delegate,Func返回一个结果,Action不返回,他们各自最多可接收4个参数,这两代表可以代表绝大多数methods,绝对强大绝对牛叉,如果你不能理解,没关系我也不能理解,但是把任何东西对象化都是件很爽的事情,这当然也包括methods,先姑且这么认为吧。
注:Lambda Expression 是 .net frameworks 3.0后的东西。除此之外以上的都是2.0的了。
Code
public delegate void Printer(string s);
public delegate string AddPrefix(string s);
public static void AnonymousMethods_LambdaExpression()
{
//命名方法:Named Methods 通过签名(signature)来指定delegate的实现
AddPrefixThenPrint("chaozi", new Printer(ImpPrinter), new AddPrefix(ImpAddPrefix));
AddPrefixThenPrint("chaozi1", ImpPrinter, ImpAddPrefix);
//匿名方法:Anonymous Methods 行内实现delegate
string prefix = "PRE_";
AddPrefixThenPrint("chaozi2", delegate(string s) { Console.WriteLine(s); }, delegate(string s) { return prefix + s.ToLower(); });
//Lambda Expressions vs Anonymous Methods
AddPrefixThenPrint("chaozi3", delegate { Console.WriteLine("Chaozi"); }, s => "prefix" + s);
AddPrefixThenPrint("chaozi4", s => Console.WriteLine(s), delegate{ return "Shichao"; });
//泛类型:Generic
AddPrefixThenPrintPro<string>("chaozi5", s => Console.WriteLine(s), s => "pre_" + s);
}
public static void AddPrefixThenPrint(string s, Printer p, AddPrefix ap)
{
p(ap(s));
}
public static void AddPrefixThenPrintPro<T>(T arg, Action<T> printer, Func<T, T> addprefix)
{
printer(addprefix(arg));
}