最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C#中委托的概念與使用

 更新時間:2023年02月27日 11:06:54   作者:微小冷  
委托這個名字取的神乎其神的,但實質是函數(shù)式編程,把函數(shù)作為參數(shù)傳遞給另一個參數(shù)。這篇文章主要為大家介紹一下C#中委托的概念與使用,需要的可以參考一下

委托的概念

委托這個名字取的神乎其神的,但實質是函數(shù)式編程,把函數(shù)作為參數(shù)傳遞給另一個參數(shù)。對于C語言程序員來說,就是把函數(shù)指針當作參數(shù)傳遞給另一個函數(shù)。

唯一需要注意的是,C#畢竟是強類型語言,用于委托的函數(shù),也相當于變成了一種可以被傳遞的變量,所以在創(chuàng)建以及調用之前,需要聲明其數(shù)據(jù)類型

delegate int Op(int a, int b);

這個委托是一種需要傳入兩個整型參數(shù)的函數(shù),返回值也是整數(shù)。接下來對這個委托進行實例化,最終代碼如下

int add(int a, int b)
{
    return a + b;
}

var addTest = new Op(add);
void calc(Op func, int a, int b)
{
    Console.WriteLine($"func({a},)={func(a,b)}");
}

calc(addTest, 2, 3);
delegate int Op(int a, int b);

事先說明一下,本文所有代碼均在.Net6的頂級語句中實現(xiàn),頂級語句需要把delegate聲明放在最下面。

其中,add是一個十分質樸的函數(shù),沒什么可說的;addTest是一個內(nèi)置了add了Op對象,其功能與add是相同的。

calc是一個以Op對象為參數(shù)的函數(shù),在這個函數(shù)中,通過Op對象func,計算了另外兩個參數(shù)a和b。

最后,調用了calc函數(shù),將addTest作為參數(shù),實質上是計算了add(2,3),并打印了這個結果。

func(2,3)=5

>“調試停止時自動關閉控制臺”。
按任意鍵關閉此窗口. . .

多播委托

所謂多播委托,就是一個委托中通過+=運算符添加多個函數(shù)。當然也可以通過-=運算符將原本添加的函數(shù)刪除掉。

為了演示這個功能,將上述代碼稍作更改。

int add(int a, int b){
    Console.WriteLine($"{a}+={a+b}");
    return a + b;
}

int minus(int a, int b){
    Console.WriteLine($"{a}-={a-b}");
    return a-b;
}

void calc(Op func, int a, int b)
{
    func(a,b);
}

Op opTest = add;
opTest += minus;
opTest += add;
opTest += minus;
calc(opTest, 3, 4);
Console.WriteLine("減去一個minus");
opTest -= minus;
calc(opTest, 3, 4);

delegate int Op(int a, int b);

其中Op opTest=add的寫法等價于Op opTest = new OpTest(add),但若省略new,則不可寫為var opTest = add,這個時候沒法進行類型推斷。

輸出結果為

3+4=7
3-4=-1
3+4=7
3-4=-1
減去一個minus
3+4=7
3-4=-1
3+4=7

由此可知,委托在調用的時候,會按照+=的先后順序調用函數(shù),并將最后一個調用的函數(shù)作為返回值。

而函數(shù)在委托中以棧的方式存放,-=會先減去后存入委托中的函數(shù)。

拖動按鈕

多播委托在GUI編程中最為常用,尤其是拖動控件時。拖動控件的流程包括三個步驟

  • 鼠標點擊控件
  • 鼠標拖動控件
  • 鼠標松開控件

則對于一個控件來說,其綁定的事件會隨著鼠標的點擊情況而發(fā)生變化

0. 鼠標未點擊時,控件需要響應鼠標點擊事件

  • 鼠標點擊之后,控件需要響應鼠標拖動、鼠標松開的事件
  • 鼠標拖動時,控件響應的事件并不發(fā)生變化
  • 鼠標松開后,控件需要解綁拖動以及松開事件

接下來,實操一下,簡單起見,GUI采用winForm,在新建項目之后,拖動一個按鈕到窗口上,右鍵按鈕->屬性,可以更改一下名字和內(nèi)容,然后點擊右下角屬性

欄的小閃電,然后注冊MouseDown事件,輸入btnTest_MouseDown并按下回車之后,IDE會自動來到代碼界面,并出現(xiàn)一個空的委托函數(shù)。

private void btnTest_MouseDown(object sender, MouseEventArgs e)
{

}

為了理解這個東西的作用,可以在解決方案資源管理器中找到Form1.Designer.cs文件,點進去之后可以看到下面這行代碼

this.btnTest.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnTest_MouseDown);

換言之,btnTest.MouseDown就是一個多播委托,剛剛我們的行為,為其注冊了一個名為btnTest_MouseDown的實現(xiàn),盡管這個實現(xiàn)現(xiàn)在還是空的。

若想拖動一個控件,第一步就是按下鼠標,按下鼠標之后,需要再注冊兩個委托,分別再拖動鼠標和松開鼠標時起作用;而松開鼠標和按下鼠標的作用剛好相反,要求取消注冊拖動事件,所以下面分別實現(xiàn)這三個功能。

private void btnTest_MouseDown(object sender, MouseEventArgs e)
{
   btnTest.MouseMove += btnTest_MouseMove;
   btnTest.MouseLeave += btnTest_MouseLeave;
}
private void btnTest_MouseLeave(object sender, EventArgs e)
{
   btnTest.MouseMove -= btnTest_MouseMove;
   btnTest.MouseLeave -= btnTest_MouseLeave;
}
private void btnTest_MouseMove(object sender, MouseEventArgs e)
{
   int dh = btnTest.Height / 2;
   int dw = btnTest.Width / 2;
   btnTest.Top = MousePosition.Y - this.Top - dh;
   btnTest.Left = MousePosition.X - this.Left - dw;
}

上面需要注意一點,MouseLeave和MouseMove, MoseDown是不同類型的委托,故而創(chuàng)建函數(shù)的參數(shù)類型是不同的。

btnTest.Top為按鈕頂端距離窗口頂端的距離;MousePosition.Y表示鼠標距離屏幕頂端的距離;this.Top表示窗口頂端距離屏幕頂端的位置,最后再減去一個按鈕高度的一半,相當于是把按鈕的中心移動到鼠標光標處。這種邏輯過于簡單粗暴,實際工作時不會用到,之所以這么寫是因為簡單。

效果如下

到此這篇關于詳解C#中委托的概念與使用的文章就介紹到這了,更多相關C#委托內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#基礎繼承和多態(tài)詳解

    C#基礎繼承和多態(tài)詳解

    C#基礎繼承和多態(tài)詳解,需要的朋友可以參考一下
    2013-03-03
  • Unity shader實現(xiàn)消融效果

    Unity shader實現(xiàn)消融效果

    這篇文章主要為大家詳細介紹了Unity shader實現(xiàn)消融效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#算法函數(shù):獲取一個字符串中的最大長度的數(shù)字

    C#算法函數(shù):獲取一個字符串中的最大長度的數(shù)字

    這篇文章介紹了使用C#獲取一個字符串中最大長度的數(shù)字的實例代碼,有需要的朋友可以參考一下。
    2016-06-06
  • C#實現(xiàn)快速排序算法

    C#實現(xiàn)快速排序算法

    本文詳細講解了C#實現(xiàn)快速排序算法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • c#在控制臺輸出彩色文字的方法

    c#在控制臺輸出彩色文字的方法

    c#在控制臺輸出彩色文字的方法,需要的朋友可以參考一下
    2013-03-03
  • C#中兩個byte如何相加

    C#中兩個byte如何相加

    可能有的看到這個題目就會覺得這不簡單嗎?直接用+號相加就行了,可是當你實際操作運行的時候就會發(fā)現(xiàn)有錯誤了,那么是什么錯誤?那該如何讓C#中兩個byte相加呢?通過下面這篇文章來一起學習學習吧。
    2016-11-11
  • C#中Dictionary與List的用法區(qū)別以及聯(lián)系詳解

    C#中Dictionary與List的用法區(qū)別以及聯(lián)系詳解

    List和Dictionary想必是我們平常用到最多的C#容器了,他們使用起來都很簡單,這篇文章主要給大家介紹了關于C#中Dictionary與List的用法區(qū)別以及聯(lián)系的相關資料,需要的朋友可以參考下
    2023-11-11
  • WPF實現(xiàn)上下滾動字幕效果

    WPF實現(xiàn)上下滾動字幕效果

    這篇文章主要為大家詳細介紹了WPF實現(xiàn)上下滾動字幕效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C#實現(xiàn)簡單俄羅斯方塊

    C#實現(xiàn)簡單俄羅斯方塊

    這篇文章主要為大家詳細介紹了C#實現(xiàn)簡單俄羅斯方塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C#將圖片和字節(jié)流互相轉換并顯示到頁面上

    C#將圖片和字節(jié)流互相轉換并顯示到頁面上

    本文主要介紹用C#實現(xiàn)圖片轉換成字節(jié)流,字節(jié)流轉換成圖片,并根據(jù)圖片路徑返回圖片的字節(jié)流,有需要的朋友可以參考下
    2015-08-08

最新評論

古浪县| 巴塘县| 汤原县| 连江县| 阿巴嘎旗| 启东市| 浦江县| 田阳县| 遂溪县| 白玉县| 枣庄市| 巴塘县| 张家川| 新野县| 南京市| 榆社县| 德清县| 姚安县| 绥宁县| 亚东县| 东至县| 岢岚县| 屏边| 仁化县| 云安县| 庐江县| 周口市| 射洪县| 锡林郭勒盟| 邓州市| 乌拉特中旗| 商洛市| 许昌市| 维西| 临朐县| 开鲁县| 昌宁县| 阳朔县| 会泽县| 浑源县| 襄城县|