c#委托详解

简介

委托是一种能够将方法作为参数传递、存储方法并且调用方法的类型,它可以让我们写出更加灵活和可扩展的代码。委托通常用于回调 (Callback) 机制,比如在事件处理、异步编程、LINQ 查询等场景中常常会使用委托。它可以将方法作为参数传递给其他方法,从而在需要的时候执行该方法。

代码演示

hello world

快速用委托写一个hello world,定义了一个名为 DelegateMethod 的委托类型,它有一个无参数的 Invoke 方法。然后在 Main 方法中,我们创建了一个名为 delegateMethod 的委托实例,并调用它的 Invoke 方法。这样就可以通过委托来调用其他方法,并在调用时传递参数。

public delegate void DelegateMethod();

public static void Main(string[] args)  
{
    DelegateMethod delegateMethod = new DelegateMethod();  
    delegateMethod();  
}

static void DelegateMethod()  
{
    Console.WriteLine("Hello, world!");  
}

 委托多播

    public delegate void Teacher();

    void Language()
    {
        Console.WriteLine("我是语文课代表");
    }

    void English()
    {
        Console.WriteLine("我是英语课代表");
    }


    public static void Main(string[] args)  
    {
        Teacher teacher = new Teacher(Language);
        teacher += English;
        teacher.Invoke();
    }

 匿名方法

延用上面的Teacher方法

    public static void Main(string[] args)  
    {
        Teacher teacher = delegate
        {
            Console.WriteLine("使用匿名方法");
        };
        teacher.Invoke();
    }

lambda表达式

    public static void Main(string[] args)  
    {
    // Teacher teacher = (如果有参数,把参数写在括号内) =>
        Teacher teacher = () =>
        {
            Console.WriteLine("使用匿名方法");
        };
        teacher.Invoke();
    }

 内置委托Action

内置委托Action是一种匿名委托类型,它可以接收一个参数并在执行时传递该参数。它通常用于执行简短的操作,例如打开一个文件或发送一条消息,等等。

Action 是一个内置类型,它定义了一个无返回值的委托类型,它可以接受一个参数。该委托类型的参数可以是任何类型,包括基本数据类型、引用类型和自定义类型。

        Action action = () => { Console.WriteLine("一个无参无返回值的委托"); };
        action.Invoke();

 

Action<int> actionInt = (i) => { Console.WriteLine($"带参数内置委托,参数为{i}"); };
actionInt.Invoke(123);

 内置委托Func

func是C#6.0中引入的一种新的函数类型,而上面的Action是C#内置的匿名委托类型。

并且Func与Action的返回值不同,Action 类型必须返回 void,func类型的返回值可以是任何类型

如下:

// 定义一个返回字符串的 func 类型函数 
func<string>(int x) => x.ToString();  
// 定义一个返回布尔值的 func 类型函数  
func<bool>(int x) => x > 0; 
// 定义一个返回自定义类型的 func 类型函数 
func<MyType>(int x) => new MyType { Value = x };   

要注意的是,如果定义的 func 类型函数返回值为自定义类型,则该自定义类型必须实现 IConvertible 接口。

演示:

        //无参有返回值
        Func<int> func = () => { return 10; };
        int f = func.Invoke();
        Console.WriteLine(f);
        
        //有参有返回值
        Func<int, int, string> funcMax = (x, y) => (x + y).ToString();
        Console.WriteLine(funcMax.Invoke(2,3));

事件

事件是一个特殊类型的委托,它包含了一个事件处理程序列表。事件处理程序在事件发生时被调用,可以在事件处理程序中处理事件和事件数据。

委托和事件实际上是相互关联的。事件本身就是一个委托,它包含了一个事件处理程序列表。当事件触发时,事件处理程序列表中的处理程序会被调用。每个事件处理程序都是一个委托,它实现了事件处理的逻辑。


    //事件是一个委托,并且是一个特殊的密封类
    public event Action Event1;

    [Test]
    public void TsetEvent()
    {
        //只能通过+=和-=来订阅与取消订阅方法
        Event1 += () => { Console.WriteLine("触发事件1"); };
        Event1 += () => { Console.WriteLine("触发事件2"); };
        Event1 += () => { Console.WriteLine("触发事件3"); };
        
        Event1.Invoke();
    }

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃香蕉的阿豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值