详解C#中委托,事件与回调函数讲解

yizhihongxing

详解C#中委托,事件与回调函数讲解

1. 什么是委托?

C#中的委托是一个指向方法的引用。简单来说,委托可以看作是方法的类型。通过委托,我们可以把一个方法作为参数传递给另一个方法,或者将一个方法赋值给一个委托变量。

声明和使用委托

在C#中,声明委托需要使用delegate关键字。下面是一个简单的委托声明示例:

public delegate void MyDelegate(string message);

上面的代码声明了一个委托类型MyDelegate,它可以指向一个带有一个字符串类型参数和返回值为void的方法。下面是一个使用委托的示例:

public class MyClass
{
    public void SayHello(string name)
    {
        Console.WriteLine($"Hello, {name}!");
    }

    public void Greet(MyDelegate myDelegate, string message)
    {
        myDelegate?.Invoke(message);
    }
}

public class Program
{
    static void Main(string[] args)
    {
        MyClass myClass = new MyClass();

        MyDelegate myDelegate = new MyDelegate(myClass.SayHello);
        myClass.Greet(myDelegate, "Jack");
    }
}

上面的代码中,MyClass类中的SayHello方法可以输出一句问候语。MyClass类中的Greet方法接受一个委托参数myDelegate和一个字符串参数message,并使用myDelegate调用一个方法,将message作为参数传递进去。

Main方法中,我们首先创建了一个MyClass实例myClass,然后创建了一个委托类型为MyDelegate的变量myDelegate,将myClass.SayHello方法作为赋值给myDelegate。最后,我们调用myClass.Greet方法,并将myDelegate和字符串"Jack"作为参数传递进去,从而使SayHello方法被调用。

泛型委托

除了普通委托类型之外,C#还提供了一些泛型委托类型,它们可以用于更灵活地指定方法参数和返回值的类型。下面是两个常用的泛型委托类型:

Action

Action是一个没有返回值的委托类型,它可以接受0到16个输入参数。下面是一个使用Action的示例:

public class MyClass
{
    public void Print(string message)
    {
        Console.WriteLine(message);
    }
}

public class Program
{
    static void Main(string[] args)
    {
        MyClass myClass = new MyClass();

        Action<string> action = myClass.Print;
        action("Hello, World!");
    }
}

上面的代码中,MyClass类中的Print方法可以输出一个字符串。在Main方法中,我们首先创建了一个MyClass实例myClass,然后创建了一个委托类型为Action<string>的变量action,将myClass.Print方法作为赋值给action。最后,我们调用action方法,并将"Hello, World!"作为字符串参数传递进去,从而使Print方法被调用。

Func

Func是一个有返回值的委托类型,它可以接受0到16个输入参数,并返回一个指定类型的值。下面是一个使用Func的示例:

public class MyClass
{
    public int Add(int x, int y)
    {
        return x + y;
    }
}

public class Program
{
    static void Main(string[] args)
    {
        MyClass myClass = new MyClass();

        Func<int, int, int> func = myClass.Add;
        int result = func(1, 2);
        Console.WriteLine(result);
    }
}

上面的代码中,MyClass类中的Add方法可以进行两个整数的加法运算。在Main方法中,我们首先创建了一个MyClass实例myClass,然后创建了一个委托类型为Func<int, int, int>的变量func,将myClass.Add方法作为赋值给func。最后,我们调用func方法,并将1和2作为参数传递进去,从而使Add方法被调用,并返回3。

2. 什么是事件?

事件是一种特殊的委托,它可以让对象间进行通信。当某个对象发生了特定的行为(例如点击按钮),就会触发一个事件,然后其他对象(例如事件处理程序)可以通过订阅该事件来响应这个行为。

声明和使用事件

在C#中,我们可以通过使用event关键字来声明一个事件。下面是一个简单的事件声明示例:

public class MyClass
{
    public event EventHandler<MyEventArgs> MyEvent;

    public void DoSomething()
    {
        OnMyEvent(new MyEventArgs("Hello, World!"));
    }

    protected virtual void OnMyEvent(MyEventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

public class MyEventArgs : EventArgs
{
    public string Message { get; private set; }

    public MyEventArgs(string message)
    {
        Message = message;
    }
}

public class Program
{
    static void Main(string[] args)
    {
        MyClass myClass = new MyClass();
        myClass.MyEvent += MyEventHandler;
        myClass.DoSomething();
    }

    static void MyEventHandler(object sender, MyEventArgs e)
    {
        Console.WriteLine(e.Message);
    }
}

上面的代码中,MyClass类中声明了一个事件MyEvent,它使用了EventHandler委托类型,并指定了一个自定义的事件参数类型MyEventArgsMyClass类中的DoSomething方法调用了一个受保护的虚拟方法OnMyEvent,它用于触发事件,并传递一个自定义的事件参数。

Main方法中,我们首先创建了一个MyClass实例myClass,然后订阅了MyEvent事件,使得MyEventHandler方法成为事件处理程序。最后,我们调用myClass.DoSomething方法,从而触发事件,并调用了MyEventHandler方法。

3. 什么是回调函数?

回调函数是一种函数指针,它可以被传递给另一个函数,从而在该函数执行结束时被调用。回调函数通常用于实现一些异步操作,例如网络请求或文件读写等操作。

使用回调函数

下面是一个使用回调函数的示例,它模拟了一个简单的文件读取操作:

public class MyClass
{
    public void ReadFile(string filePath, Action<string> callback)
    {
        string content = File.ReadAllText(filePath);
        callback?.Invoke(content);
    }
}

public class Program
{
    static void Main(string[] args)
    {
        MyClass myClass = new MyClass();
        myClass.ReadFile("test.txt", HandleFileContent);
    }

    static void HandleFileContent(string content)
    {
        Console.WriteLine(content);
    }
}

上面的代码中,MyClass类中的ReadFile方法使用File.ReadAllText方法读取了一个文本文件的内容,并调用了一个回调函数callback,将文本内容作为参数传递进去。

Main方法中,我们首先创建了一个MyClass实例myClass,然后调用了myClass.ReadFile方法,并将文件路径和一个委托类型为Action<string>的回调函数HandleFileContent作为参数传递进去。当ReadFile方法执行结束时,HandleFileContent方法会被调用,并输出文件的内容。

总结

委托、事件和回调函数是C#中非常重要的概念,能够帮助我们更好地实现代码的灵活性和复用性。在使用它们时,我们需要注意声明、使用委托类型的方式、各种委托类型的特点、事件处理程序的订阅和取消等方面的注意事项。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C#中委托,事件与回调函数讲解 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • C#程序中session值的保存方法以及转为字符串的方法总结

    下面是关于C#程序中session值的保存方法以及转为字符串的方法总结的攻略: 保存Session的值的方法 在C#程序中,我们可以使用Session来保存用户的信息,下面是几种常见的保存Session的值的方法: 1. 使用Session对象保存 Session["key"] = "value"; 这是最常见的一种方…

    C# 2023年5月15日
    00
  • 使用位运算实现网页中的过滤、筛选功能实例

    使用位运算实现网页中的过滤、筛选功能,通常适用于多选项、多条件的情况下,可以大大提高筛选的效率和处理速度。下面我会给出一个完整攻略,包含示例说明。 步骤一:建立数据标记规则 在使用位运算进行网页过滤、筛选时,首先要建立数据标记规则。这个规则可以是二进制中的 1 和 0,也可以是其他数字、字符等。 例如,在一家电商网站中,有多个筛选条件,比如价格、品牌、颜色、…

    C# 2023年6月7日
    00
  • 在.NET程序崩溃时自动创建Dump的思路详解

    以下是关于在.NET程序崩溃时自动创建Dump的思路详解: 1. 问题描述 在.NET程序运行过程中,可能会遇到各问题,例如崩溃、死锁、内存泄漏等。为了更好地诊断和解决这些问题我们需要在程序崩溃时自创建Dump文件。本攻略将介绍如何实现在.NET程序崩溃时自动创建Dump文件。 2. 解决方案 在.NET程序中,我们使用Microsoft.Diagnosti…

    C# 2023年5月12日
    00
  • C#中Cookie之存储对象

    C#中Cookie之存储对象 在C#中,可以使用Cookie对象来存储客户端数据,如用户的登录信息等。那么,在C#中如何使用Cookie来存储对象呢? 1. 创建Cookie对象并存储对象 首先,需要创建Cookie对象,然后将待存储的对象转换为Json字符串。可以使用Json.Net等工具来进行转换。 以一个自定义的Person类为例: public cl…

    C# 2023年5月31日
    00
  • 利用AOP实现SqlSugar自动事务

    当我们需要进行数据库事务时可以选择使用SqlSugar框架,它提供了很好的事务机制。但是在多个方法中,我们需要显式地开启和提交事务,这使得我们的代码显得复杂和冗长。为了避免这个问题,我们可以使用AOP(面向切面编程)思想来减少代码中事务的重复出现。 1. AOP基本概念 在AOP中,我们可以将一些通用代码分离出来并应用到多个方法中,这些方法称为切点。通用代码…

    C# 2023年6月6日
    00
  • REST架构及RESTful应用程序简介

    REST架构及RESTful应用程序简介 REST(Representational State Transfer)是一种基于HTTP协议的Web服务架构。RESTful应用程序是符合REST架构的应用程序。本文将介绍REST架构及RESTful应用程序的基本概念和实现方法。 REST架构的基本概念 REST架构的基本概念包括资源、URI、HTTP方法和状态…

    C# 2023年5月15日
    00
  • ASP.NET MVC SSO单点登录设计与实现代码

    ASP.NET MVC SSO单点登录(Single Sign-On)是一种在多个应用程序中使用相同的身份验证凭据登录的方案。在这种方案中,用户只需一次登录,即可轻松访问所有相关的应用程序。 下面是ASP.NET MVC SSO单点登录设计与实现的完整攻略: 1. 认识 SSO 单点登录 单点登录是一种用户只需登录一个系统就可以实现多系统认证的场景。SSO …

    C# 2023年5月31日
    00
  • C#并行编程之PLINQ(并行LINQ)

    那我就简要介绍下C#并行编程中的PLINQ,并提供两个示例说明。 什么是PLINQ? PLINQ,全名叫做Parallel LINQ,是C#中的一个并行编程库。它基于LINQ(Language Integrated Query,语言集成查询),可以让我们更方便地执行并行查询和数据操作。相较于手动编写多线程代码,PLINQ让我们的代码更加容易编写和维护,从而大…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部