委托机制

本文详细介绍了委托的概念及其在C#中的应用。通过实例演示了如何定义委托、实例化委托对象及执行委托,最后通过一个实际案例展示了如何利用委托实现不同窗体间的值传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)理解

委托实际上就是“命令”,比如“小明委托小张去买火车票”,也就是“小明命令小张去买火车票”。也就是说的是,对于委托者来说,他是什么也不做的,他只是一个命令的发出者,而被委托者,则是执行委托者所发出的命令。

通过委托实现窗体回传值,就是实现一个解决方案中两个窗体实现相互传值,实现的方法就是将相应的委托对象借助构造方法来实现相应的实现。


2)实例中理解委托机制

==>定义委托

delegate void HandleInterfaceUpdateDelegate(string text); 使用关键字delegate进行声明表示这是一个委托,并表示每个委托的实例都包含一个方法的细节,并且该方法带有一个string类型的参数,比如eat(string food),不能传入eat()这类方法。

==> 实例化委托对象

HandleInterfaceUpdateDelegate interfaceUpdateHandle;

interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox);

 

    private void UpdateTextBox(string text)

        {

            contentN2.Text = text;

}

实质上,创建委托并实例化委托对象,和创建普通的类并创建类对象的原理是一样的。可以看出的是,创建委托对象时,传入的是某一个方法名,而在委托中,则是存储的是需要操作的方法地址。

3)执行

  this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) });

此时委托已经被附上了具体的方法。

   实例:

==> 准备工作

新建一个解决方案,在这个解决方案中,通过新建项目选项,分别创建三个项目,其中包括两个“控制台项目01、02”和一个“类库项目”。(此时自己创建了一个类库,当其他项目想要使用这个类库项目中的方法,必须要将这个类库项目引用到相应的项目中)

==>代码

1) 结果最终实现

其中控制台01项目输出字符串“今天天气不错!”,而控制台02项目输出当前时间。

2) 方案实现

最简单的方法实现就是在类库中创建两个方法,一个是“console.writeline(“今天天气不错!”);”,另一个方法则是“console.writeline(“时间{0}”,DateTime.Now.toString());”。对于这个简单的问题使用这个方法实现是没有问题的,这只是两个需求,如果是存在着200个这样的需求,而对于类库而言,它就是一个共享库,如果每次都要进行改动,那么对于整体项目是没有好处的,因此,对于类库而言,只是实现化简,不能增加负担。

3) 使用委托模式实现

==>定义委托

创建委托和创建类是一样的,如public delegate void aa();只是对于委托是没有方法体的。

==>代码

控制台01:

namespace _01委托

{

    class Program

    {

        static void Main(string[] args)

        {

            DeleteLibrary.Class1 delete =new DeleteLibrary.Class1();

            delete.deleDemo = method1;

            delete.aa();

            Console.Read();

        }

 

        static void method1()

        {

            Console.WriteLine("当前时间是{0}",DateTime.Now.ToString());

        }

    }

}

控制台02:

namespace _02委托

{

    class Program

    {

        static void Main(string[] args)

        {

            DeleteLibrary.Class1 delete =new DeleteLibrary.Class1();

            delete.deleDemo = method2;

            delete.aa();

            Console.Read();

        }

        static void method2()

        {

            Console.WriteLine("今天天气不错");

        }

    }

}

公共类库:

namespace DeleteLibrary

{

    public class Class1

    {

        public aaDelegate deleDemo;

        public void aa()

        {

            Console.WriteLine("******************");

            Console.WriteLine("******************");

            if (deleDemo != null)

            {

                deleDemo();

            }

            Console.WriteLine("******************");

            Console.WriteLine("******************");

        }

    }

}

委托:

namespace DeleteLibrary

{

    public delegate void aaDelegate();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值