2009年4月21日 星期二

C#.Net 委派 Delegate 的演進簡易範例

C#.Net 委派 Delegate 的演進簡易範例, 來源: 資策會 講師 王芳芳指導

#region Delegate委派演進

// Step 1: create Delegate Class, 建立委派, 傳入參數的定義要與要執行的Method一樣
public delegate bool TestDelegate(int n);

public bool Test(int n) //委派要執行的kethod
{
return n > 5; //如果傳入值>5就傳回true, 否則傳回false
}

private void button2_Click(object sender, EventArgs e)
{
//C# 1.0 委派具名方法
//Step 2: Create Delegate Object

TestDelegate delegateObj = new TestDelegate(Test); //new一個委派實體, 去執行Test Method

//Step 3. Invoke
MessageBox.Show(delegateObj.Invoke(5).ToString()); //執行委派, sohow出結果


//C# 2.0 委派匿名方法, 直接在委派裡寫Method內容
TestDelegate delegateObj_2 = delegate(int n)
{
//.......其它程式碼
return n > 5;
};

MessageBox.Show(delegateObj_2.Invoke(6).ToString());

//buttonX.Click += new EventHandler(buttonX_Click);

//註冊buttonX的button Click的Event給委派, 裡面再實做委派的內容
buttonX.Click += delegate(object sender1, EventArgs e1) { MessageBox.Show("xxxx Clicked"); };


//=========================================================
//C# 3.0 lambda Expression- 匿名方法簡潔版 (內部其實還是 compile C# 2.0 匿名方法)

//執行一個委派, 傳入參數n, Go through(=>)到如果n>5傳回true, 否則傳回false
TestDelegate delegateObj_3 = n => n > 5;

//也可以這樣寫, //執行一個委派, 傳入參數n, Go through(=>)到如果n>5傳回true, 否則傳回false
delegateObj_3 = (int n) =>
{
return n > 5;
};

MessageBox.Show(delegateObj_3.Invoke(6).ToString());

//以下為使用LINQ配合上述的 (n => n > 5) 委派去取得陣列裡需要的內容
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var q = nums.Where(n => n > 5);

//傳入陣列nums, 取得索引為>=2 和 索引<=6的值
//where的多載方法裡面, 如果帶入第2個變數(index), 則第2個變數為索引index
q = nums.Where((n, index) => index >= 2 && index <= 6);

foreach (int i in q)
{
listBox1.Items.Add(i);
}
}
#endregion

private void buttonX_Click(object sender, EventArgs e)
{
MessageBox.Show("Button X Clicked");
}

沒有留言:

張貼留言