欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C#教程

當(dāng)前位置:主頁 > 軟件編程 > C#教程 >

詳解C#中通過委托來實現(xiàn)回調(diào)函數(shù)功能的方法

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C#教程|點擊: 次

委托(delegate)是一種可以把引用存儲為函數(shù)的類型,這類似于c++中的函數(shù)指針。

回調(diào)函數(shù)
c++中的回調(diào)函數(shù),就是用函數(shù)指針來實現(xiàn)的。類似的,c#中用委托,來實現(xiàn)回調(diào)函數(shù)的功能。

回調(diào)函數(shù)為什么被稱為回調(diào)函數(shù)?比如你調(diào)用了一個函數(shù),那么就叫調(diào)用,但是如果你在調(diào)用一個函數(shù)的時候,還需要把一個函數(shù)提供給該函數(shù),讓這個函數(shù)來調(diào)用你的函數(shù),那么你提供的這個函數(shù)就被稱為回調(diào)函數(shù)(callback)。

對于python這樣的動態(tài)語言而言,就沒有c#,c++提供特殊的語法實現(xiàn)回調(diào)函數(shù),因為在python中,函數(shù)也是一個對象,無論是當(dāng)參數(shù)傳,還是當(dāng)函數(shù)的返回值,都不會有問題。

回調(diào)函數(shù)還被用來當(dāng)作一個“插件”:

在C++的STL庫中,排序函數(shù)的具體算法已經(jīng)被實現(xiàn),但是兩個元素的具體比較辦法,通過回調(diào)函數(shù)提供(比較函數(shù)),保證該算法可用于int,string等不同類型。

void sort( iterator start, iterator end );
void sort( iterator start, iterator end, StrictWeakOrdering cmp );

c#委托
委托常常被使用在事件處理中。因為可以將事件觸發(fā)后的具體操作(該做哪些事情)委托給實現(xiàn)類。這個就是好萊塢法則,“Don't call me, I will call you”。

這個例子來源于c#經(jīng)典入門:

delegate double ProcessDelegate(double param1, double param2);

static double Multiply(double param1, double param2)
{
  return param1 * param2;
}

staitc double Divide(double param1, double param2)
{
  return param1 / param2;
}

if (input == "M")
  process = new ProcessDelegate(Multiply);
else
  process = new ProcessDelegate(Divide);

但真實情況我們并不通過邏輯判斷初始化回調(diào)函數(shù),下面的這個函數(shù)插件的例子更常見。

static void ExecuteFunction(ProcessDelegate process)
{
process(2.2, 3.3);
}

C#委托實現(xiàn)回調(diào)的實例:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Threading; 
 
namespace Stockes 
{ 
  public partial class CallBack : Form 
  { 
    public CallBack() 
    { 
      InitializeComponent(); 
      //初始化回調(diào)方法 
      writeBoxCallback1 = new WriteBoxCallback1(Write1); 
      writeBoxCallbacK2 = new WriteBoxCallback2(Write2); 
    } 
    //聲明委托已實現(xiàn)回調(diào)機制 
    private delegate void WriteTextBox(char ch); 
    private WriteTextBox writeTextBox; 
     //Text1的回調(diào) 
    private delegate void WriteBoxCallback1(char ch); 
    private WriteBoxCallback1 writeBoxCallback1; 
    //Text2的回調(diào) 
    private delegate void WriteBoxCallback2(char ch); 
    private WriteBoxCallback2 writeBoxCallbacK2; 
    private void button1_Click(object sender, EventArgs e) 
    { 
      if (checkBox1.Checked) 
      { 
        groupBox4.Text = "正在運行。。。"; 
        groupBox4.Refresh(); 
        textBox1.Clear(); 
        textBox1.Refresh(); 
        Thread th1 = new Thread(new ThreadStart(dowrite1));//創(chuàng)建線程1 
        th1.Start();//啟動線程1 
      } 
      if (checkBox2.Checked) 
      { 
        groupBox2.Refresh(); 
        groupBox5.Text = "正在運行。。。"; 
        groupBox5.Refresh(); 
        textBox2.Clear(); 
        textBox2.Refresh(); 
        Thread th2 = new Thread(new ThreadStart(dowrite2));//創(chuàng)建線程2 
        th2.Start();//啟動線程2 
      } 
    } 
    //Text1使用回調(diào)語句 
    private void CallTex1(char ch) 
    { 
      textBox1.Invoke(writeBoxCallback1,ch); 
    } 
    //Text2使用回調(diào)語句 
    private void CallText2(char ch) 
    { 
      textBox2.Invoke(writeBoxCallbacK2,ch); 
    } 
    //使用委托 
    private void WriteTex(WriteTextBox write) 
    { 
      string str = textBox3.Text.Trim(); 
      for (int i = 0; i < str.Length; i++) 
      { 
        write(str[i]); 
        DateTime now = DateTime.Now; 
        while (now.AddSeconds(1) > DateTime.Now) { } 
      } 
    } 
    //Text1添加值 
    private void Write1(char ch) 
    { 
      textBox1.AppendText(ch+"\r"); 
    } 
    //Text2添加值 
    private void Write2(char ch) 
    { 
      textBox2.AppendText(ch+"\r"); 
    } 
    //線程1調(diào)用的方法 
    private void dowrite1() 
    { 
      if (checkBox1.Checked) 
      { 
        writeTextBox = new WriteTextBox(CallTex1); 
        WriteTex(writeTextBox); 
      } 
    } 
    //線程2調(diào)用的方法 
    private void dowrite2() 
    { 
      if (checkBox2.Checked) 
      { 
        writeTextBox = new WriteTextBox(CallText2); 
        WriteTex(writeTextBox); 
      } 
    } 
  } 
} 

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有