網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
特性一:委托
委托是C#語(yǔ)言中特有的概念,相當(dāng)于C/C++中的函數(shù)指針,與C/C++中函數(shù)指針的不同之處是:委托是面向?qū)ο蟮摹㈩愋桶踩暮捅kU(xiǎn)的,是引用類型。因此,對(duì)委托的使用要
“先定義、后聲明,接著實(shí)例化、然后作為參數(shù)傳遞給方法,最后才能使用”。
1、定義委托使用關(guān)鍵字delegate:
delegate? void SomeDelegate(type1 para1,......typen paran);
2、聲明委托:
SomeDelegate? d;
3、實(shí)例化委托:
d=new SomeDelegate(obj.InstanceMethod);
其中obj是對(duì)象,InstanceMethod是它的實(shí)例方法。
4、作為參數(shù)傳遞給方法
someMethod(d);
5、最后在此方法的實(shí)現(xiàn)代碼中使用委托
private? void? someMethod(SomeDelegate? someDelegate) { ?? ..... ?? //使用委托 ? someDelegate(arg1,arg2,....,argn); ? ......? }
通過(guò)委托SomeDelegate實(shí)現(xiàn)對(duì)方法InstanceMethod的調(diào)用,調(diào)用還必須有一個(gè)前提條件:方法InstanceMethod有參數(shù)且和定義SomeDelegate的參數(shù)一致,并且返回類型相同(本例中為void)。方法InstanceMethod的定義:
private? void? InstanceMethod(type1 para1,type2 para2,......,typen paran) { ?? //方法體 ? ..... }
委托的實(shí)例化中的參數(shù)既可以是實(shí)例方法,也可以是靜態(tài)方法。
使用委托實(shí)現(xiàn)“文字抄寫(xiě)員”的小程序,界面如下:
在下方文本框中編輯文字,勾選“書(shū)寫(xiě)到”組框中的“文本區(qū)1”和(或)“文本區(qū)2”復(fù)選框后單擊“提交”按鈕,程序會(huì)自動(dòng)將文本框中的文字“抄寫(xiě)”到對(duì)應(yīng)的用戶勾選的文本區(qū)中去。
代碼實(shí)現(xiàn)如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace DelegateDemo { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } //1、定義委托 private delegate void WriteToTextBox(string strTxt); //2、聲明委托 private WriteToTextBox writeToTextBox; ////// 提交 /// /// /// private void btn_OK_Click(object sender, EventArgs e) { if (chbOne.Checked) { gbJobOne.Text = "運(yùn)行中......"; gbJobOne.Refresh(); txtJobOne.Clear(); //3、實(shí)例化委托 writeToTextBox = new WriteToTextBox(WriteTextBox1); //4、將委托作為方法的參數(shù)進(jìn)行傳遞 WriteText(writeToTextBox); gbJobOne.Text = "任務(wù)1完成"; } if (chbTwo.Checked) { gbJobTwo.Text = "運(yùn)行中......"; gbJobTwo.Refresh(); txtJobTwo.Clear(); //3、實(shí)例化委托 writeToTextBox = new WriteToTextBox(WriteTextBox2); //4、將委托作為方法的參數(shù)進(jìn)行傳遞 WriteText(writeToTextBox); gbJobTwo.Text = "任務(wù)2完成"; } } private void WriteText(WriteToTextBox writeMethod) { string strData = this.txt_Input.Text; writeMethod(strData); } private void WriteTextBox1(string strTxt) { this.txtJobOne.Text = strTxt; } private void WriteTextBox2(string strTxt) { this.txtJobTwo.Text = strTxt; } ////// 窗體加載事件 /// /// /// private void FrmMain_Load(object sender, EventArgs e) { //設(shè)置文本框獲取焦點(diǎn) this.ActiveControl = this.txt_Input; //this.txt_Input.Focus(); } } }
特性2:多線程
多線程的具體介紹請(qǐng)參考博文:https://www.jb51.net/article/238731.htm
使用多線程實(shí)現(xiàn)上一節(jié)的程序,代碼如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading;//引入多線程的命名空間 namespace DelegateDemo { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } //1、定義委托 private delegate void WriteToTextBox(string strTxt); //2、聲明委托 private WriteToTextBox writeToTextBox; ////// 提交 /// /// /// private void btn_OK_Click(object sender, EventArgs e) { //創(chuàng)建線程1 Thread thread1 = new Thread(new ThreadStart(ExecuteTsk1)); //啟動(dòng)線程1 thread1.Start(); //創(chuàng)建線程2 Thread thread2 = new Thread(new ThreadStart(ExecuteTsk2)); //啟動(dòng)線程2 thread2.Start(); } private void ExecuteTsk1() { if (chbOne.Checked) { gbJobOne.Text = "運(yùn)行中......"; gbJobOne.Refresh(); txtJobOne.Clear(); //3、實(shí)例化委托 writeToTextBox = new WriteToTextBox(WriteTextBox1); //4、將委托作為方法的參數(shù)進(jìn)行傳遞 WriteText(writeToTextBox); gbJobOne.Text = "任務(wù)1完成"; } } private void ExecuteTsk2() { if (chbTwo.Checked) { gbJobTwo.Text = "運(yùn)行中......"; gbJobTwo.Refresh(); txtJobTwo.Clear(); //3、實(shí)例化委托 writeToTextBox = new WriteToTextBox(WriteTextBox2); //4、將委托作為方法的參數(shù)進(jìn)行傳遞 WriteText(writeToTextBox); gbJobTwo.Text = "任務(wù)2完成"; } } private void WriteText(WriteToTextBox writeMethod) { string strData = this.txt_Input.Text; writeMethod(strData); } private void WriteTextBox1(string strTxt) { this.txtJobOne.Text = strTxt; } private void WriteTextBox2(string strTxt) { this.txtJobTwo.Text = strTxt; } ////// 窗體加載事件 /// /// /// private void FrmMain_Load(object sender, EventArgs e) { //設(shè)置文本框獲取焦點(diǎn) this.ActiveControl = this.txt_Input; //允許跨線程調(diào)用 Control.CheckForIllegalCrossThreadCalls = false; } } }
特性3:C#方法回調(diào)
C#回調(diào)的具體介紹請(qǐng)參照博文:https://www.jb51.net/article/238731.htm#_label3
使用委托、多線程和C#的方法回調(diào)機(jī)制實(shí)現(xiàn)上一節(jié)的程序,代碼如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading;//引入多線程的命名空間 namespace DelegateDemo { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } //1、定義委托 private delegate void WriteToTextBox(string strTxt); //2、聲明委托 private WriteToTextBox writeToTextBox; //定義并聲明操作文本區(qū)1的回調(diào) private delegate void WriteTxtJobOneCallBack(string strValue); WriteTxtJobOneCallBack writeTxtJobOneCallBack; //定義并聲明操作文本區(qū)2的回調(diào) private delegate void WriteTxtJobTwoCallBack(string strValue); WriteTxtJobOneCallBack writeTxtJobTwoCallBack; //定義并聲明操作"任務(wù)1"分組框的回調(diào) private delegate void ShowGroupOneCallBack(string strValue); ShowGroupOneCallBack showGroupOneCallBack; //定義并聲明操作"任務(wù)2"分組框的回調(diào) private delegate void ShowGroupTwoCallBack(string strValue); ShowGroupOneCallBack showGroupTwoCallBack; ////// 提交 /// /// /// private void btn_OK_Click(object sender, EventArgs e) { //創(chuàng)建線程1 Thread thread1 = new Thread(new ThreadStart(ExecuteTsk1)); //啟動(dòng)線程1 thread1.Start(); //創(chuàng)建線程2 Thread thread2 = new Thread(new ThreadStart(ExecuteTsk2)); //啟動(dòng)線程2 thread2.Start(); } private void ExecuteTsk1() { if (chbOne.Checked) { //3、實(shí)例化委托 writeToTextBox = new WriteToTextBox(WriteTextBox1); //4、將委托作為方法的參數(shù)進(jìn)行傳遞 WriteText(writeToTextBox); //使用回調(diào) this.gbJobOne.Invoke(showGroupOneCallBack, "任務(wù)1"); } } private void ExecuteTsk2() { if (chbTwo.Checked) { //3、實(shí)例化委托 writeToTextBox = new WriteToTextBox(WriteTextBox2); //4、將委托作為方法的參數(shù)進(jìn)行傳遞 WriteText(writeToTextBox); //使用回調(diào) this.gbJobTwo.Invoke(showGroupTwoCallBack, "任務(wù)2"); } } ////// 執(zhí)行自定義委托 /// /// private void WriteText(WriteToTextBox writeMethod) { string strData = this.txt_Input.Text; writeMethod(strData); } ////// 給文本區(qū)1賦值 /// /// private void WriteTextBox1(string strTxt) { //使用回調(diào) this.txtJobOne.Invoke(writeTxtJobOneCallBack, strTxt); } ////// 給文本區(qū)2賦值 /// /// private void WriteTextBox2(string strTxt) { //使用回調(diào) this.txtJobTwo.Invoke(writeTxtJobTwoCallBack, strTxt); } ////// 窗體加載事件 /// /// /// private void FrmMain_Load(object sender, EventArgs e) { //設(shè)置文本框獲取焦點(diǎn) this.ActiveControl = this.txt_Input; //實(shí)例化回調(diào) writeTxtJobOneCallBack = new WriteTxtJobOneCallBack(WriteToTextJobOne); writeTxtJobTwoCallBack = new WriteTxtJobOneCallBack(WriteToTextJobTwo); showGroupOneCallBack = new ShowGroupOneCallBack(ShowGroupOne); showGroupTwoCallBack = new ShowGroupOneCallBack(ShowGroupTwo); } ////// 操作文本區(qū)1的回調(diào)要執(zhí)行的方法 /// /// private void WriteToTextJobOne(string strValue) { this.txtJobOne.Text = strValue; } ////// 操作文本區(qū)2的回調(diào)要執(zhí)行的方法 /// /// private void WriteToTextJobTwo(string strValue) { this.txtJobTwo.Text = strValue; } ////// 操作"任務(wù)1"分組框的回調(diào)要執(zhí)行的方法 /// /// private void ShowGroupOne(string strValue) { this.gbJobOne.Text = strValue; } ////// 操作"任務(wù)2"分組框的回調(diào)要執(zhí)行的方法 /// /// private void ShowGroupTwo(string strValue) { this.gbJobTwo.Text = strValue; } } }
原文鏈接:https://www.cnblogs.com/dotnet261010/p/6206068.html
相關(guān)推薦
- 2022-09-25 Linux基礎(chǔ)組件之死鎖檢測(cè)
- 2022-07-14 Android實(shí)現(xiàn)手機(jī)多點(diǎn)觸摸畫(huà)圓_Android
- 2022-04-23 Tooltip 組件:根據(jù)內(nèi)容是否溢出判斷是否顯示 Tooltip
- 2022-12-01 Python?async+request與async+aiohttp實(shí)現(xiàn)異步網(wǎng)絡(luò)請(qǐng)求探索_pytho
- 2022-10-06 react最流行的生態(tài)替代antdpro搭建輕量級(jí)后臺(tái)管理_React
- 2022-12-29 python解決循環(huán)依賴的問(wèn)題分析_python
- 2022-06-04 C++求解二叉樹(shù)的下一個(gè)結(jié)點(diǎn)問(wèn)題_C 語(yǔ)言
- 2022-08-20 手把手帶你用Python實(shí)現(xiàn)一個(gè)計(jì)時(shí)器_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支