C# Delegate用法

    对于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方法的一个委托,然后模板窗口的代码不需要修改,只需要在调用的时候传入不同的委托就好。

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

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

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,关于delegate的四种方法可以简要总结如下: 1. 使用delegate关键字声明一个委托类型,然后通过实例化委托类型来创建一个委托实例,最后通过委托实例来调用方法。 2. 使用匿名方法来创建委托实例,匿名方法允许我们在需要的地方内联定义一个方法。 3. 使用Lambda表达式来创建委托实例,Lambda表达式提供了一种简洁的语法形式来定义匿名方法,并且可以自动推断参数的类型。 4. 使用Func、Action和Predicate等预定义的委托类型来创建委托实例,这些预定义的委托类型提供了不同数量和类型的参数,并且可以指定返回值的类型。 总结起来,C#中使用delegate的四种方法是:使用delegate关键字声明委托类型并实例化、使用匿名方法、使用Lambda表达式和使用预定义的委托类型。这些方法都可以用来创建委托实例并调用相应的方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C# Delegate讲解](https://download.csdn.net/download/liyangaad/10160723)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C#使用委托(delegate)实现在两个form之间传递数据的方法](https://download.csdn.net/download/weixin_38704565/14868625)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C#利用delegate实现Javascript的each方法](https://download.csdn.net/download/weixin_38694541/13990952)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值