c#委托详解

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();
        }
    }
}

在每个窗体上边添加一个按钮,一个文本框,实现从一个文本框传递值到另外一个文本框。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值