C#自學(一)委託(delegate)、委託泛型、多播委託

程式碼一身發表於2014-07-30

       為了開發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表示式的使用技巧。




相關文章