C# Delegate用法

来源:互联网 发布:淘宝大学免费课程视频 编辑:程序博客网 时间:2024/05/22 02:17

    对于delegate的通俗理解就是一个指向函数的指针,它的出现使函数可以像变量一样写到函数列表中去,下面跟随一个实例去了解下:

    由于只是为了解其用法,所以建一个控制台应用程序完全足够满足要求(先贴代码,然后解释):

    控制台类:                                                                                               新建的类:

namespace Deletegate
{
    public delegate void ShowMessageDelegate();
    class Program
    {
        static void ShowMessageOne()
        {
            Console.WriteLine("This is Message1!!");
        }
        static void ShowMessageTwo()
        {
            Console.WriteLine("This is Message2!!");
        }
        static string ShowClassOne(string name)
        {
            return name + ":NO1";
        }
        static string ShowClassTwo(string name)
        {
            return name + ":NO2";
        }

        static void Main(string[] args)
        {
            ShowMessageDelegate show=null;
            show += ShowMessageOne;  
            show += ShowMessageTwo;
            show();

            MyClass c1 = new MyClass(ShowClassOne);
            Console.WriteLine(c1);

            MyClass c2 = new MyClass(ShowClassTwo);
            Console.WriteLine(c2);

            Console.ReadKey();
        }
       
    }
}

namespace Deletegate
{
    public class MyClass
    {
        public delegate string ShowClass(string ss);

        public MyClass(ShowClass shofuc)
        {
            MyShow = shofuc;
        }

        public ShowClass MyShow { get; set; }

        public string ClassName { get { return "MyClass"; } }

        public override string ToString()
        {

            return MyShow(ClassName);
        }
    }
}

从代码中可以看出:

1. 给Delegate变量可以Add多个相同类型的函数,其结果相当于将这些函数依次执行。这就是为什么在对话框应用程序中,经常会对某个事件附加处理函数,例如,

List,SelectedChanged+=EventHander,void EventHander(object sender, System.EventArgs e),EventHander 是自己实现的响应函数,这也就是事件萎托所用的。

2.委托可以作为另外一个函数的参数传递,上面的代码可以看出:

在Program类中实现了两个方法,一个是ShowClassOne,一个是ShowClassTwo,分别用来对传入参数name的两种处理,C1,C2实现的时候分别传入不同的委托,进而实现不同的显示结果。当然,也可以在MyClass类中实现,不过每添加一种显示方式就得改一次MyClass类,这是很不好的,可重用性太差,如此,便可以解决。

在实际编程中。你可能会遇到下面的问题:

     做系统的时候,免不了和数据打交道,增,删,改,查最常用,在界面应用程序中,我们可能会以弹出对话框的形式对数据进行添加和修改,这两个对话框如何组织呢,当然是会写一个模板窗口,然后实例话不同而已,这时实现可以有两种方式:

    1> 在模板窗口中设置一个变量Sign,根据传入sign的不同实现话不同的窗口中,数据源变化,“保存”的实现等,只需要添加一个Case判断,分别执行不同的语句。

    2>在模板窗口中传入Save方法的一个委托,然后模板窗口的代码不需要修改,只需要在调用的时候传入不同的委托就好。

    第一种方法可重用性显面易见不如第二种方法,当需要实例化的窗口增多时,不可预计时,第一种方法代价太大。孰优孰劣,只有在自己编程时用到才会知道。

上面程序的运行结果如下图:

 

一家之言,请各位大牛批评指正~ ~!

原创粉丝点击