说来惭愧,在大学的课程中,竟然没有听说过委托这个名称。那么今天我就带着大家一起探讨下委托和事件。
咱们先来看下委托
我主要从以下几个方面讲解
1, 为什么使用委托 2.什么是委托 3.委托如何使用
为什么使用委托?
委托是c#中非常重要的一个概念,使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。
什么是委托?
委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有相同的行为,委托方法的使用和其他方法一样,具有参数和返回值。
如何使用委托
下面咱们就抛开枯燥的概念,来看几个活生生的例子是怎么使用委托的吧!
案例1:中国人和英国人问好
分析:1.首先我们需要编写一个中国人问好的方法和一个英国人问好的方法。
2.编写一个Greet方法,将问好方法作为一个参数,实现各个国家人的问好方法。
3.使用委托实现各个国家人的问好功能
使用委托分为三个步骤:1,定义委托 2.声明委托变量 3.使用委托
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);
}
}
</div>
为了加深大家对委托的理解,我们再来写一个相似的例子。
案例2:翻译案例:通过委托将英文翻译为中文和韩文
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("翻译成韩语了!");
}
}
</div>
通过这个案例,我们可以看出使用委托的方法不止一种,无论使用哪种方式,最终都和方式一一样。通过反编译我们可以证明:
如下图示我通过反编译看到方法二的代码:
![]() |
如下是反编译后方法三的代码
![]() |
有了上述知识存储,我们再来看一个案例:
案例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)
{