您的位置:首页 > 编程语言 > C#

委托机制

2016-09-12 16:11 253 查看
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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息