平時我們如果要用到委託一般都是先聲明一個委託類型,比如:
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");
}
轉自:http://www.cnblogs.com/Gyoung/archive/2013/04/04/2997050.html