C#自學(一)委託(delegate)、委託泛型、多播委託
為了開發windows phone應用程式,對於多年在java方向的我可謂從零開始,所以就抱著一本C#高階程式設計慢慢開始吭
從.net體系結構》》物件型別》》繼承》》泛型》》委託
在這裡不僅是為了分享自己的學習簡介,也是為了以後來來查詢學習。
廢了這麼多話,現在我們正式開始了
首先我們應該知道什麼是委託,標識方法的類,它給方法的簽名和返回型別指定名稱(為方法指定別名,這是我的理解),它非常類似C++裡面的函式指標,但是C#的委託是型別安全的,而C++的函式指標可以將任何一個地址作為函式指向,這就造成了不安全啦。可以通過定義的委託物件呼叫方法
一,簡單的委託使用
定義委託的語法如下:
delegate int myDelegate(int input);
上面的語法定義了一個委託myDelegate,也就以一個方法的簽名,包括方法的引數型別,返回值型別。注意:在定義委託時,必須給出它所表示的方法簽名和返回型別等全部資訊
我們定義了一個委託,那麼如果使用了?
我們先定一個委託需要的方法:
int myFunc(int input){
Debug.Console.WriteLine("you number is {0}",input};
return input*input;
}
然後我們給委託賦值,這裡有兩種方式實現:
第一種:
myDelegate = new myDelegate(myFunc);//括號裡面只需要傳入方法的名稱即可,定義的委託必須與傳入的方法簽名一致
第二種:
myDelegate = myFunc;
最後就是呼叫我們的委託了:
int _output= myDelegate(100);//就像呼叫你定義的方法一樣的方式來呼叫委託<pre class="csharp" name="code"> int _output = myDelegate.Invoke(100);//也可以這樣呼叫,產生的效果一樣
二,關於Action<T>與Func<T>委託
Action<T>是不帶返回引數的委託,Func<T>是帶2有返回引數的委託,Action也叫多播委託,聽不懂?沒關係,後面我們慢慢到來。
1.我們來了解一下關於Func<T>的使用,Func<T>是委託的另一種使用方式。下面看一個簡單的例項
Func<int,int> testFunc=myFunc;//兩個尖括號中,第一個表示的是傳入引數的型別,最後一個表示的是返回值型別
呼叫方式:
int _output = testFunc(100);
Func<T>最多可以帶入16個引數,最後一個引數都是表示函式的返回型別
更上一層樓,下面是我寫的一個排序方法:
<pre class="csharp" name="code"> static void Sort<T>(IList<T> list, Func<T, T, bool> comparer)//這裡就可以傳入一個委託引數,用於比較
{
bool swapped = false;
do
{
swapped = false;
for (int i = 0; i < list.Count - 1; i++)
{
if (comparer(list[i], list[i + 1]))
{
T temp = list[i];
list[i] = list[i + 1];
list[i + 1] = temp;
swapped = true;
}
}
} while (swapped);
}
//我是這樣使用的
int[] ints = { 1, 3, 1, 2, 23, 5, 34, 3, 43, 2, 343, 3532, 53, 2, 86, 33, 4, 10 };
Sort<int>(ints, (i, j) => i > j ? true : false);//不要疑惑,第二個引數是使用的lambda表示式,也可以使用函式定義
//如下
bool compare(int i,int j){
return i>j?true:false;
}
Sort<int>(ints, compare);
2.下面講解多播委託
所謂多播委託,就是一個委託可以順序執行多個函式。
首先我們定義兩個方法:
//多播委託不能帶有返回值,如果有?只返回最有一個被加入的函式的返回值
void one(int i){
Debug.Console.WriteLine(i);
}
void two(int i){
Debug.Console.WriteLine(i);
}
現在定義一個多播委託:
Action<int> action = one;//int表示傳入引數的型別
我們如何加入更多的委託呢?我們可以使用+或者+=的方式新增,相反,我們可以使用-或者-=的方式刪除。其實在GUI程式設計中經常會看到+=的方式為事件新增執行函式,就是通過多播委託實現(在沒有學習C#之前,有編寫一個倉庫管理軟體,那時候也不知道為什麼,但是就是這麼用的,因為當時編寫軟體的時候業務邏輯重一些,所以沒有系統的學習C#,因為C#很多東西和java是相通,上手容易)
例如新增新委託:
action+=two;
呼叫委託:
action(100);//這裡就會自動的順序的呼叫所有的委託,執行。
擴充套件:有時候會出現委託裡面丟擲異常,如果丟擲異常,之後所有的委託都不會執行,因此我們還有一種手動執行的方式,你可以在你的程式碼裡面捕獲異常並處理,如下:
Delegate[] actions=action.GetInvocationList();
foreach(Action<int> a in actions){
try{
a(100);
}catch(Exception e){
//
}
}
三、匿名方法
到目前為止,要想使委託工作,方法必須己經存在(即委託是用它將呼叫的方法的相同簽名定義
的)。但還有另外一種使用委託的方式:即通過匿名方法。下面看一個簡單的例子:
Func(string,string> dele = delegate(string param〉
(
return param*parame;
) //這裡就不需要事先宣告委託
委託的初步使用就到這裡啦,學習了為託一定要把lambda表示式學會,這回讓你的程式碼看起來非常的美觀優雅,編寫程式碼也大大減少,很多開發這喜歡C#的原因貌似就有這個。
後續我會繼續分享關於Lambda表示式的使用技巧。
相關文章
- C# 委託(delegate)、泛型委託和Lambda表示式C#泛型
- C#委託(delegate)C#
- 瞭解下C# 委託(Delegate)C#
- C#基礎:泛型委託C#泛型
- C#-委託delegateC#
- 委託、Lambda表示式、事件系列04,委託鏈是怎樣形成的, 多播委託, 呼叫委託鏈方法,委託鏈異常處理事件
- 委託與事件-委託詳解(一)事件
- c#委託C#
- 委託、事件--委託例項篇事件
- 五分鐘重溫C#委託,匿名方法,Lambda,泛型委託,表示式樹C#泛型
- ios中的多播委託iOS
- C#規範整理·泛型委託事件C#泛型事件
- 五分鐘重溫委託,匿名方法,Lambda,泛型委託,表示式樹泛型
- C# 事件委託C#事件
- C# 委託事件C#事件
- 事件委託事件
- C#深入學習:泛型修飾符in,out、逆變委託型別和協變委託型別C#泛型型別
- 委託、Lambda表示式、事件系列01,委託是什麼,委託的基本用法,委託的Method和Target屬性事件
- C#的委託案例C#
- C#委託與事件C#事件
- C#委託理解(1)C#
- c# 委託測試C#
- C#再識委託C#
- C# 事件 vs 委託C#事件
- C#中的委託C#
- .Net委託型別解析型別
- 委託、Lambda表示式、事件系列07,使用EventHandler委託事件
- jQuery 事件委託jQuery事件
- 委託筆記筆記
- .NET委託解析
- Java-委託Java
- C# 之委託與事件C#事件
- 什麼是委託(C#)C#
- 委託、Lambda表示式、事件系列05,Action委託與閉包事件
- 詳解C#委託和事件(一)C#事件
- winform實現委託ORM
- C#事件委託事件
- 重中之重:委託與事件事件