位置:首頁(yè) > 軟件操作教程 > 編程開(kāi)發(fā) > C# > 問(wèn)題詳情

委托的建立

提問(wèn)人:劉冬梅發(fā)布時(shí)間:2020-10-12

1. 建立一個(gè)委托類型,并聲明該委托可以指向的方法的簽名(函數(shù)原型)

delegate void MyDelegate(int a,int b);

2.建立一個(gè)委托類的實(shí)例,并指向要調(diào)用的方法

//利用委托類的構(gòu)造方法指定,這是最為常見(jiàn)的一種方式

MyDelegate md=new MyDelegate(Max);

//利用自動(dòng)推斷方式來(lái)指明要調(diào)用的方法,該形式更類型于函數(shù)指針

MyDelegate md=Max;

3.利用委托類實(shí)例調(diào)用所指向的方法

int c=md(4,5);

下面通過(guò)實(shí)例來(lái)演示C#中委托的使用。

 案例操作020601:利用委托實(shí)現(xiàn)方法的動(dòng)態(tài)調(diào)用

首先,添加如下控件:

? 兩個(gè)RadioButton,分別用來(lái)讓用戶選擇求最大值以及求最小值

? 二個(gè)TextBox,用來(lái)輸入兩個(gè)操作數(shù)

? 一個(gè)TextBox,用來(lái)顯示運(yùn)算結(jié)果

? 一個(gè)Button,用來(lái)執(zhí)行運(yùn)算

界面如下圖所示:

image.png

下一步,在窗口中添加兩個(gè)方法:Max,Min,這兩方法的代碼如下:

int Max(int x,int y)

{

return x>y?x:y;

}

int Min(int x,int y)

{

return x<Y?X:Y;< font>

}

窗口中的代碼,如下圖所示:

image.png

下一步:為了使用委托來(lái)實(shí)現(xiàn)動(dòng)態(tài)指向,我們需要建立一個(gè)委托類“MyDelegate”,并建立該委托類型的一個(gè)實(shí)例,如下圖所示:

image.png

上面的代碼中,我們可以發(fā)現(xiàn),此時(shí),還沒(méi)有讓MyDelegate類型的實(shí)例“md”指向任何一個(gè)方法(即:md的值為null),原因是:在編寫(xiě)代碼的時(shí)候,我們還不知道用戶想要調(diào)用哪一個(gè)方法。

下一步,分別為兩個(gè)RadioButton編寫(xiě)它們的“CheckedChanged”事件,代碼如下:

private void rbtMax_CheckedChanged(object sender, EventArgs e)

{

if (this.rbtMax .Checked ==true)

{

this.md = new MyDelegate(this.Max );

}

}

private void rbtMin_CheckedChanged(object sender, EventArgs e)

{

if (this.rbtMin .Checked ==true)

{

this.md = new MyDelegate(this.Min );

}

}

這段代碼是,如果用戶選擇了求最大值的RadioButton,則讓MyDelegate類型的實(shí)例“md”指向Max方法,如果用戶選擇了求最小值的RadioButton,則讓MyDelegate類型的實(shí)例“md”指向Min方法。這樣作的目的,就是要把選擇的過(guò)程交給用戶。

下一步,我們?yōu)榻缑嬷械?/span>Button編寫(xiě)Click事件,并利用委托來(lái)調(diào)用求最值的方法。代碼如下所示:

private void btGetResult_Click(object sender, EventArgs e)

{

if (this.md ==null )

{

MessageBox.Show("委托md沒(méi)有指向任何方法!");

return;

}

int a = int.Parse(this.tbxOP1 .Text );

int b = int.Parse(this.tbxOP2 .Text );

int c = this.md(a,b);

this.tbxResult.Text = c.ToString();

}

從上面的代碼中,可以發(fā)現(xiàn),在使用委托之前,先要判斷其值是否為空,如果不為空,則可以進(jìn)行調(diào)用,同時(shí),使用者可以看到,在調(diào)用md時(shí),我們并沒(méi)有關(guān)心md到底指向了哪一個(gè)方法,總之,md不為空的時(shí)候,就一定會(huì)指向MaxMin當(dāng)中的一個(gè)。

為了讓求最大值的RadioButton在程序開(kāi)始運(yùn)行的時(shí)候就被選中,在FormLoad事件中添加如下代碼:

private void Form1_Load(object sender, EventArgs e)

{

this.md = new MyDelegate(this.Max );

}

運(yùn)行的效果如下圖所示:

image.png

image.png

繼續(xù)查找其他問(wèn)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部