委托与实践1
平时我们如果要用到委托一般都是先声明一个委托类型,比如:
private delegate string Say();
string 说明适用于这个委托的方法的返回类型是 string 类型,委托名 Say 后面没有参数,说明对应的方法也就没有传入参数。
写一个适用于该委托的方法:
public static string SayHello() { return " Hello " ; }
最后调用:
static void Main( string [] args) { Say say = SayHello; Console.WriteLine(say()); }
这里我们先声明委托,然后再将方法传给该委托。有没有办法可以不定义委托变量呢?
答案是肯定的,我们可以用 Func .
Func 是.NET里面的内置委托,它有很多重载。
Func< TResult > :没有传入参数,返回类型为 TResult 的委托。就像我们上面的Say委托,就可以用 Func<string> 来替代,调用如下:
static void Main( string [] args) { Func < string > say = SayHello; // Say say = SayHello; Console.WriteLine(say()); }
怎么样,有了 Func 很简单吧。看一下 Func 别的重载。
Func< T , TResult > 委托:有一个传入参数 T ,返回类型为 TResult 的委托。如:
// 委托 传入参数类型为string,方法返回类型为int Func< string , int > a = Count;
// 对应方法 public int Count( string num) { return Convert.ToInt32(num); }
Func< T1 , T2 , TResult > 委托:有两个传入参数: T1 与 T2 ,返回类型为 TResult 。
类似的还有 Func(T1, T2, T3, TResult) 委托、 Func(T1, T2, T3, T4, TResult) 委托等。用法差不多,都是前面为方法的传入参数,最后一个为方法的返回类型。
Func 也可以与匿名方法一起使用如:
public static void Main() { Func < string , int , string []> extractMeth = delegate ( string s, int i) { char [] delimiters = new char [] { ' ' }; return i > 0 ? s.Split(delimiters, i) : s.Split(delimiters); }; string title = " The Scarlet Letter " ; // Use Func instance to call ExtractWords method and display result foreach ( string word in extractMeth(title, 5 )) Console.WriteLine(word); }
同样它也可以接 lambda 表达式
public static void Main() { char [] separators = new char [] { ' ' }; Func < string , int , string []> extract = (s, i) => i > 0 ? s.Split(separators, i) : s.Split(separators) ; string title = " The Scarlet Letter " ; // Use Func instance to call ExtractWords method and display result foreach ( string word in extract(title, 5 )) Console.WriteLine(word); }
Func 都是有返回类型的,如果我们的方法没有返回类型该怎么办呢?铛铛铛,这时 Action 就要粉墨登场了。
Action 委托:没有传入参数,也没有返回类型,即Void。如:
static void Main( string [] args) { Action say = SayHello;
say(); } public static void SayHello( ) { Console.WriteLine( " Say Hello " ); }
Action< T > 委托:传入参数为 T ,没有返回类型。如:
static void Main( string [] args) { Action < string > say = SayHello; say( " Hello " ); } public static void SayHello( string word ) { Console.WriteLine(word); }
Action< T1 , T2 > 委托:两个传入参数,分别为 T1 与 T2 ,没有返回类型。
Action 同样的还有许多其它重载,每个重载用法一样,只是方法的传入参数数量不一样。
其实 Action 与 Func 的用法差不多,差别只是一个有返回类型,一个没有返回类型,当然 Action 也可以接匿名方法和 Lambda 表达式。
匿名方法:
static void Main( string [] args) { Action < string > say = delegate ( string word) { Console.WriteLine(word); }; say( " Hello Word " ); }
Lambda 表达式:
static void Main( string [] args) { Action < string > say = s => Console.WriteLine(s); say( " Hello Word " ); }
如果我的文章对你有帮助,就点一下推荐吧.(*^__^*)
标签: .NET
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息