c#中的泛型委托详解

下面是对泛型委托在C#中的详细讲解及示例说明:

泛型委托的概念

泛型委托(Generic Delegate)是一个带有泛型参数的委托,具有良好的扩展性和通用性,可以适配各种需求,使代码更加简洁、灵活。在泛型委托的定义中,可以指定一个或多个泛型类型参数,可以用于引用任意返回值和参数的委托类型。

在C#中,使用Func<>Action<>两种泛型委托类型来表示任意函数引用和无返回值函数引用。

Func<>委托类型可用于引用任意带返回值的方法,其定义为:

public delegate TResult Func<out TResult>();
public delegate TResult Func<in T, out TResult>(T arg);
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
……

其中,第一个参数 TResult 表示委托返回类型,out 表示返回类型,其余参数类型 TT1T2 等为委托参数类型,in 表示输入类型。

Action<> 委托类型可用于引用任意无返回值的方法,其定义为:

public delegate void Action();
public delegate void Action<in T>(T arg);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
……

Func<> 类似,Action<> 委托也是带有泛型类型参数的,且泛型参数末尾必须是返回类型 Void,表示这是一个无返回值的方法。

示例说明

以下是两个示例说明泛型委托在C#中的使用:

示例一:使用 Func<> 委托类型

在示例一中,使用 Func<> 委托类型引用 int 类型的加法和除法方法,并对两个数进行计算。代码如下所示:

using System;

class Program
{
    static void Main(string[] args)
    {
        Func<int, int, int> add = (a, b) => a + b;    //定义加法方法
        Func<int, int, int> divide = (a, b) => a / b; //定义除法方法

        int num1 = 6, num2 = 2;

        Console.WriteLine("两数之和:{0}", add(num1, num2));
        Console.WriteLine("两数之商:{0}", divide(num1, num2));

        Console.ReadKey();
    }
}

在代码中,定义 adddivide 两个 Func<> 委托变量分别引用 int 类型的加法和除法方法。对于 add 变量,使用 => 表示 Lambda 表达式,将 a + b 表示为其方法体。对于 divide 变量,使用 => 表示 Lambda 表达式,将 a / b 表示为其方法体。

Main 方法中,定义 num1num2 两个整型变量,调用 adddivide 方法对两个数进行计算,并输出结果。运行程序,会得到以下输出结果:

两数之和:8
两数之商:3

示例二:使用 Action<> 委托类型

在示例二中,使用 Action<> 委托类型引用 string 类型的转换方法,并将转换结果输出。代码如下所示:

using System;

class Program
{
    static void Main(string[] args)
    {
        Action<string> toUpperCase = (str) => Console.WriteLine(str.ToUpper()); //定义转换为大写字母方法
        Action<string> toLowerCase = (str) => Console.WriteLine(str.ToLower()); //定义转换为小写字母方法

        string str = "Hello, World!";

        toUpperCase(str);
        toLowerCase(str);

        Console.ReadKey();
    }
}

在代码中,定义 toUpperCasetoLowerCase 两个 Action<> 委托变量分别引用 string 类型的转换为大写字母和小写字母的方法。对于 toUpperCase 变量,使用 => 表示 Lambda 表达式,将 Console.WriteLine(str.ToUpper()) 表示为其方法体。对于 toLowerCase 变量,使用 => 表示 Lambda 表达式,将 Console.WriteLine(str.ToLower()) 表示为其方法体。

Main 方法中,定义 str 字符串变量,调用 toUpperCasetoLowerCase 方法对字符串进行转换,并输出结果。运行程序,会得到以下输出结果:

HELLO, WORLD!
hello, world!

以上是使用 C# 中的泛型委托进行编程的示例。通过使用泛型委托可以减少编写大量不同类型的委托的工作,并提高代码的灵活性和通用性,使得代码更加简洁高效。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#中的泛型委托详解 - Python技术站

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

相关文章

  • Url相对路径的问题总结

    URL相对路径问题总结 在网页开发中,我们常常需要引用其他文件的资源,比如图片、CSS文件和JavaScript文件等等。而在标签属性中,我们可以写入文件的URL地址来引用这些资源。为了方便管理和维护,有时候我们会使用相对路径的方式来引用这些资源。但是相对路径也有可能出现问题,因此我们需要了解URL相对路径的问题,本文将对这个问题做出详细的解释。 问题描述 …

    C# 2023年5月31日
    00
  • CommunityToolkit.Mvvm8.1 MVVM工具包安装引用指南(1)

      本系列文章导航 https://www.cnblogs.com/aierong/category/2297596.html     0.说明 CommunityToolkit.Mvvm包(又名MVVM 工具包,以前名为 Microsoft.Toolkit.Mvvm)是一个现代、快速且模块化的 MVVM 库。它支持:.NET Standard 2.0、 .…

    C# 2023年4月18日
    00
  • C#使用远程服务调用框架Apache Thrift

    使用远程服务调用框架Apache Thrift的完整攻略需要经过以下步骤: 步骤一:安装和配置Apache Thrift Apache Thrift可以在官网上下载,下载链接:https://thrift.apache.org/download 安装完毕后,需要配置环境变量。配置完成后,在命令行中输入thrift -version可以查看全局的Thrift版…

    C# 2023年6月1日
    00
  • C#中的cookie编程简单实例与说明

    C#中的cookie编程可以用来在客户端存储和检索数据。下面将介绍如何使用cookie编程,并提供两个简单的示例来说明如何在C#中使用cookie。 什么是cookie cookie是在Web浏览器中存储的小型文本文件,用于存储用户的偏好设置、登录信息、购物车等数据。当用户与网站建立连接时,网站可以将cookie发送到用户的浏览器中,浏览器将会存储该cook…

    C# 2023年5月31日
    00
  • 简单聊一聊Go语言中的数组和切片

    简单聊一聊Go语言中的数组和切片 在Go语言中,数组和切片是两种常用的数据结构。本文将提供一个详细的Go语言中数组和切片的攻略,包括定义、初始化、访问、遍历、添加、删除等操作。 数组 定义和初始化 在Go语言中,数组是一种固定长度的数据结构,可以存储相同类型的元素。可以按照以下方式定义和初始化数组: var arr [5]int // 定义一个长度为5的in…

    C# 2023年5月15日
    00
  • 浅谈C#中[]的几种用法

    浅谈C#中[]的几种用法 在C#中,方括号[]有着多种不同的用法。本文将全面解析它们的用法及细节。 数组 最经典的用法就是定义数组。数组是将相同类型的变量按一定顺序排列组合而成的一组数据,它们共用一个名称。使用时可以通过索引(下标)来访问这些变量。先看下面的示例代码: int[] scores = { 12, 34, 56, 78, 99 }; Consol…

    C# 2023年6月1日
    00
  • [译]在C#中使用IComparable和IComparer接口

    原文:Use the IComparable and IComparer interfaces in Visual CSharp 本文介绍了在Visual C#中如何使用IComparer和IComparable接口。 概要 本文同时讨论了IComparable和IComparer接口,原因有两点。这两个接口经常一起使用。虽然接口类似且名称相似,但它们却有不…

    C# 2023年5月3日
    00
  • C#内置泛型委托之Action委托

    当我们在C#中需要定义一个不带参数且没有返回值的委托时,可以使用Action委托来实现。Action委托是一个内置的泛型委托,用于封装一个无参数且无返回值的方法。 Action委托的语法 下面是Action委托的语法: public delegate void Action(); public delegate void Action<in T>…

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