1委托是一个数据类型,跟类一样,是数据类型的一种,使用时候需要new一个实体才能使用,使用前需要定义;委托是存放方法的,委托的级别和类是一个级别的,定义在命名空间中
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
MyDelegate md = new MyDelegate(M);
//也可以如下使用
//MyDelegate md=M;//直接将方法名赋值给委托,底层原理还是new了一个MyDelegate
md();//调用委托
Console.ReadKey();
}
static void M()
{
Console.WriteLine("ok");
}
}
public delegate void MyDelegate();//定义委托
}
2.委托就是把变化的东西封装起来,可以在不改变代码的情况下实现多种功能
需求:两个类除了有一句代码执行不同之外,别的都是相同的,一个需要写到一个文件,一个需要输出打印,除此之外都是一样的,应该怎么做?
先定义一个实现该方法的类:
namespace com.wbs.test
{
public class MyTest
{
public void dosomething(Mydelegate md)
{
Console.WriteLine("aaaaaaaa");
Console.WriteLine("aaaaaaaa");
if (md != null)
{
md();//执行委托中调用的方法
}
Console.WriteLine("aaaaaaaa");
Console.WriteLine("aaaaaaaa");
}
}
public delegate void Mydelegate();//定义委托;
}
第一种用途:保存文件:
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
MyTest md = new MyTest();
md.dosomething(wenjian);
Console.ReadKey();
}
public static void wenjian()
{
File.WriteAllText("/time.txt", System.DateTime.Now.ToShortDateString());
}
}
}
第二种:打印字符:
namespace ConsoleApp4
{
class Program
{
static void Main(string[] args)
{
MyTest md = new MyTest();
md.dosomething(dayin);
Console.ReadKey();
}
public static void dayin()
{
Console.WriteLine("aaaaaaaa");
}
}
}
通过上边的例子,可以掌握委托中最基本的用法;
下边的例子来更深的讲解委托中方法的传递
需求:两个窗体,第一个输入字符串,点击按钮,第二个窗体显示第一个的输入的字符,更改第二个文本框中的字符,点击第二个文本框的按钮,第一个文本框的内容跟着改变,该怎么实现?
Form1的代码
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(this.textBox1.Text.Trim(), Update);
f2.Show();
}
public void Update(string s)
{
this.textBox1.Text = s;
}
}
public delegate void MyDelegate(string s);
}
Form2的代码
namespace WindowsFormsApp1
{
public partial class Form2 : Form
{
private MyDelegate update1;
public Form2()
{
InitializeComponent();
}
public Form2(string str,MyDelegate update) : this()
{
this.textBox1.Text = str;
this.update1 = update;//将此方法传递给定义的update1
}
private void button1_Click(object sender, EventArgs e)
{
this.update1(this.textBox1.Text.Trim());//其实调用的是窗体1的Update方法
this.Close();
}
}
}
在每个窗体上边添加一个按钮,一个文本框,实现从一个文本框传递值到另外一个文本框。