C#委托

来源:互联网 发布:golang 统计文章字数 编辑:程序博客网 时间:2024/04/27 21:31

1,  为什么使用委托  2.什么是委托  3.委托如何使用

为什么使用委托?

委托是c#中非常重要的一个概念,使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。

什么是委托?

委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有相同的行为,委托方法的使用和其他方法一样,具有参数和返回值。

如何使用委托

下面咱们就抛开枯燥的概念,来看几个活生生的例子是怎么使用委托的吧!

 案例1:中国人和英国人问好

 分析:1.首先我们需要编写一个中国人问好的方法和一个英国人问好的方法。

       2.编写一个Greet方法,将问好方法作为一个参数,实现各个国家人的问好方法。

       3.使用委托实现各个国家人的问好功能

  使用委托分为三个步骤:1,定义委托  2.声明委托变量  3.使用委托



      // 1.定义委托  
        public delegate void GreetDelegate(string name); 
       class Program 
     { 
         static void Main(string[] args) 
         { 
                      //2.声明委托变量 
  GreetDelegate dDelegate = new GreetDelegate(ChineseGreeting); 
 //3.使用委托 
             dDelegate("李小龙"); 
             Console.ReadKey(); 
         } 
 //中国人问好方法 
         public static void ChineseGreeting(string name) 
         { 
             Console.WriteLine("早上好!" + name); 
         } 
         //英国人问好方法 
         public static void EnglishGreeting(string name) 
         { 
             Console.WriteLine("Morning!" + name); 
         } 
         public static void Greet(string name, GreetDelegate makeGreet) 
         { 
             makeGreet(name); 
         } 
   }
 案例2:翻译案例:通过委托将英文翻译为中文和韩文

//01.声明一个委托类  
 public delegate void MyTransDelegate(string words); 
 class Program 
     { 
         static void Main(string[] args) 
         { 
             //翻译方法 
             //调用方法一 
             //2.声明委托 
             MyTransDelegate del=new MyTransDelegate(TransToCN); 
             //3.调用委托 
             del("aa"); 
 //调用方法二 
             Translate("aa",TransToCN); 
             //调用方式三 
             //MyTransDelegate del = TransToCN; 
             //del("aa"); 
              Console.ReadKey(); 
         } 
   
 static  void Translate(string str,MyTransDelegate del) 
         { 
             del(str); 
         } 
         static void TransToCN(string str) 
         { 
             Console.WriteLine("翻译成中文了!"); 
         } 
         static void TransToKorean(string str) 
         { 
             Console.WriteLine("翻译成韩语了!"); 
         } 
 }
 

案例3:通过委托将子窗体中的值传递到父窗体中

如图有父窗体和子窗体两个窗体,现在我想实现当点击父窗体中按钮时弹出子窗体(当然这个超级简单),在弹出子窗体后,在子窗体的文本框中输入内容,点击关闭按钮后子窗体关闭,并且将子窗体中输入的内容在父窗体的文本框中显示。

 

子窗体中代码如下:



//定义委托  
         public delegate void Words(string words); 
         //声明委托变量 
         public Words words; 
         private void button1_Click(object sender, EventArgs e) 
         { 
             words(txtchild.Text); 
             this.Close(); 
         } 
 父窗体中的代码: 
 private void btnOpen_Click(object sender, EventArgs e) 
         { 
             Child child = new Child(); 
             child.words = GetWords; 
             child.Show(); 
         } 
         public void GetWords(string str) 
         { 
             txtMain.Text = str; 
         }
 我们来分析下上述两断代码:

首先,我们想在子窗体关闭时,更新父窗体文本框中的数据。但是我们非常清楚的知道,窗体之间的空间是不能直接相互访问的,这时我们就要找一个中介帮我们实现父窗体数据的更新功能。于是我们定义了带一个参数没有返回值的委托Words,并且在父窗体中定义了一个方法GetWords符合委托的条件。于此同时,在子窗体中声明了一个委托变量words,并且在关闭按钮中,调用了委托变量。

但在子窗体中我们没有对子窗体委托变量赋值,真正的赋值放到了主窗体中。这样通过委托就实现了在子窗体中调用父窗体的方法,进而实现了父窗体文本框内容的更新。


0 0