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#基礎:泛型委託C#泛型
- C#-委託delegateC#
- C#委託C#
- 委託與事件-委託詳解(一)事件
- C#規範整理·泛型委託事件C#泛型事件
- 簡單多播委託Demo
- ios中的多播委託iOS
- C#深入學習:泛型修飾符in,out、逆變委託型別和協變委託型別C#泛型型別
- # 委託
- 委託
- 事件委託事件
- C# - 委託與事件C#事件
- C#委託與事件C#事件
- c# 委託和事件C#事件
- C#委託理解(1)C#
- c#中的委託C#
- C#的委託案例C#
- 行為委託
- Java-委託Java
- 詳解C#委託和事件(一)C#事件
- dotnet 委託的實現解析(2)開放委託和封閉委託 (Open Delegates vs. Closed Delegates)
- C#反射的委託建立器C#反射
- C#基礎委託回顧C#
- 詳解C#委託與事件C#事件
- C#基礎之委託,事件C#事件
- .NET進階篇02-Delegate委託、Event事件事件
- 委託的好處
- winform實現委託ORM
- Kotlin基礎 — 委託Kotlin
- wpf移除事件委託事件
- 04.委託Delegation
- UE4委託
- 詳解C#委託和事件(二)C#事件
- JQuery7:事件委託jQuery事件
- 事件模型和事件委託事件模型
- 優化委託的 `DynamicInvoke`優化
- js中的事件委託JS事件