【.NET Core】匿名方法与扩展方法

news/2024/5/19 23:43:26 标签: .netcore, java, 开发语言, microsoft, c#

【.NET Core】匿名方法与扩展方法

文章目录

  • 【.NET Core】匿名方法与扩展方法
    • 一、匿名方法
      • 1.1 匿名方法定义
      • 1.2 通过Delegate关键字创建委托匿名方法
      • 1.3 通过Action关键字创建无返回值的匿名方法
      • 1.4 通过Func关键字创建有返回值的匿名方法
      • 1.5 使用Lambda表达式表示匿名方法
    • 二、扩展方法
      • 2.1 扩展方法定义
      • 2.2 编译时的扩展方法
      • 2.3 值类型如何定义扩展方法
      • 2.4 如何定义和调用扩展方法

一、匿名方法

1.1 匿名方法定义

委托是用于引用与其具有相同标签的方法。可以使用委托对象调用可由委托引用的方法。匿名方法(Anonymous methods)提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。在匿名方法中不需要指定返回类型,它是从方法主体内的return语句推断而来。

1.2 通过Delegate关键字创建委托匿名方法

匿名方法可以通过delegate来声明一个委托的匿名方法声明。

示例如下:

c#">public class Program
{

    //无返回值的匿名方法
    public delegate void MethodParameterFree(string name);
    MethodParameterFree MethdFree = delegate (string name)
    {
        Console.WriteLine($"无参的匿名方法,输出值={name}");
    };
    //有返回值,且返回值为string匿名方法
    public delegate string MethodParameterReturnString(string name);
    MethodParameterReturnString methodParameterReturn = delegate (string name)
    {
        return $"有参的匿名方法,返回值为:{name}";
    };

    public static void Main(string[] args)
    {
       Program program= new Program();
        program.MethdFree("MethodParameterFree.");
       string response= program.methodParameterReturn("ReturnValue");
        Console.WriteLine(response);
    }     
}

1.3 通过Action关键字创建无返回值的匿名方法

示例如下:

c#">Action<string> MethdFree = (string name)=>
{
    Console.WriteLine($"无参的匿名方法,输出值={name}");
};
public static void Main(string[] args)
{
    Program program= new Program();
    program.MethdFree("MethodParameterFree.");
}

1.4 通过Func关键字创建有返回值的匿名方法

c#">Func<string,int,string> MethdFunc = (string name,int age)=> $"Func匿名方法,姓名={name},年龄={age}";
public static void Main(string[] args)
{
    Program program= new Program();
    string response=   program.MethdFunc("Goyeer",39);
    Console.WriteLine(response);
}

隐式输入参数匿名函数

c#">Func<string,int,string> MethdFunc = (name,age)=> $"Func匿名函数,姓名={name};年龄={age}";
public static void Main(string[] args)
{
    Program program= new Program();
    string response=   program.MethdFunc("Goyeer",39);
    Console.WriteLine(response);
}

使用弃元指定Lambda表达式中未使用的参数

c#">Func<string,int,string> MethdFunc = (_,_)=> $"Func弃元,处理未使用匿名方法。";
public static void Main(string[] args)
{
    Program program= new Program();
    string response=   program.MethdFunc("Goyeer",39);
    Console.WriteLine(response);
}

1.5 使用Lambda表达式表示匿名方法

c#">public static void Main(string[] args)
{
    var RetrunValueMethod = (string name, int age) => { 
        Console.WriteLine($"Lambda表达式无返回值匿名方法,姓名={name},年龄={age}");
    };
    
    RetrunValueMethod("GOYEER",42);
    //Lambda有返回值
    var MethdFunc = (string name, int age) => $"Func Lambda表达式表示匿名方法,姓名={name},年龄={age}。";
    Console.WriteLine(MethdFunc("Gogeer",39));
}

二、扩展方法

2.1 扩展方法定义

扩展方法使用你能够向现有类型添加方法,而无需创建新的派生类型,重新编译或以其他方式修改原始类型。扩展方法是一种静态方法,但可以像扩展类型上的实例方法一样进行调用。调用扩展方法与调用在类型中定义方法没有明显区别。

最常用的扩展方法是LINQ标准查询运算符,它将查询功能添加到现有的System.Collections.IEnumerableSystem.Collections.Generic.IEnumerable<T>类型。

扩展方法被定义为静态方法,它们是通过实例方法语法进行调用的。它们的第一参数指定方法操作的类型。参数前面是此修饰符。仅当你使用using指令将命名空间显示导入到源代码中之后,扩展方法才位于范围中。

2.2 编译时的扩展方法

可以使用扩展方法来扩展类或接口,但不能重写扩展方法。与接口或类方法具有相同名称和签名的扩展方法永远不会被调用。编译时,扩展方法的优先级总是比类型本身中的实例方法底。如果某个类型具有一个名为Process(int i)的方法,而你有一个具有相同签名的扩展方法,则编译器总是绑定到该实例方法。当编译器遇到方法调用时,它首先在该类型的实例方法中寻找匹配的方法。如果未找到任何匹配的方法,编译器将搜索为该类型定义的任何扩展方法,并且绑定到它找到的第一个扩展方法。

2.3 值类型如何定义扩展方法

使用struct类型扩展预定义类型可能很困难,因为他们已通过值传递给方法。这意味着将对结构的副本进行任何结构更改。扩展方法退出后,将不显示这些更改。可以将ref修饰符添加到第一个参数,使其成为ref扩展方法。ref关键字可以在this关键字之前或之后显示,不会有任何语义差异。添加ref修饰符表示第一个参数是按引用传递的,在这种情况下,可以编写扩展方法更改要扩展的值类型。扩展方法仅允许值类型或受结构约束的泛型类型作为ref扩展方法的第一参数。

c#">public static class IntExtensions
{
    public static void Increment(this int number)
        => number++;
    public static void RefIncrement(this ref int number)
        => number++;
}

public static class IntProgram
{
    public static void Test()
    {
        int x = 1;
        x.Increment();
        Console.WriteLine($"x is now {x}"); //输出结果: x is now 1
        x.RefIncrement();
        Console.WriteLine($"x is now {x}"); //输出结果: x is now 2
    }
}

2.4 如何定义和调用扩展方法

  1. 定义包含扩展方法的静态类。此类必须对客户端代码可见。
  2. 将扩展方法实现为静态方法,并且使用可见性至少与所在类的可见性相同。
  3. 此方法的第一个参数指定方法所操作的类型;此参数前必须加上this修饰符,值类型需要变更变量值的需要在this后ref关键字。
  4. 在调用代码中,添加 using 指令,用于指定包含扩展方法类的命名空间
  5. 和调用类型的实例方法那样调用这些方法。

第一个参数并不是由调用代码指定,因为它表示要在其上应用运算符的类型,并且编译器已经知道对象的类型。

示例

public static class MyExtensions
{
     public static int WordCount(this string str)
     {
         return str.Split(new char[] { ' ', '.', '?' },
                             StringSplitOptions.RemoveEmptyEntries).Length;
     }
}

http://www.niftyadmin.cn/n/5293804.html

相关文章

go语言面试一逃逸分析

一、逃逸分析 go语言中也会存在c语言的内存泄漏和指针逃逸&#xff0c;所以go语言采用了逃逸分析来解决这种危险情况。 内存泄漏&#xff1a;如果使用C语言中的malloc动态分配内存&#xff0c;但却使用后忘记释放该内存&#xff0c;那么该内存就会发生泄漏&#xff0c;即原内…

MongoDB聚合:$merge 阶段(1)

$merge的用途是把聚合管道产生的结果写入指定的集合&#xff0c;有时候可以用$merge来做物化视图。需要注意&#xff0c;$meger操作必须是聚合管道的最后一个阶段。具体功能有&#xff1a; 能够输出到当前或不同的数据库能够输出到正在聚合的集合&#xff08;慎重&#xff1a;…

【音视频 ffmpeg 学习】 RTMP推流 mp4文件

1.RTMP(实时消息传输协议)是Adobe 公司开发的一个基于TCP的应用层协议。 2.RTMP协议中基本的数据单元称为消息&#xff08;Message&#xff09;。 3.当RTMP协议在互联网中传输数据的时候&#xff0c;消息会被拆分成更小的单元&#xff0c;称为消息块&#xff08;Chunk&#xff…

NFC物联网智能学生宿舍系统设计方案

随着物联网技术的不断发展&#xff0c;智慧城市、智能家居、智慧校园的建设也在如火如茶地进行。本文结合物联网发展过程中相关的技术&#xff0c;应用到智慧校园的建设过程中&#xff0c;将学生宿舍打造成舒适、安全的集体空间&#xff0c;该系统可以对学生宿舍实现智能开门、…

刷算法-- leetcode 96. 不同的二叉搜索树

思路 观察树的组成&#xff0c;可以发现n3时的二叉搜索树可以由&#xff0c;头节点分别为1、2、3时的所有结果组成&#xff01;定义dp[i]为由i个节点组成的二叉搜索树的个数。确定递推公式&#xff0c;dp[i] 由1为头节点组成的二叉搜索树个数由2为头组成的个数…由i为头节点组…

ubuntu:beyond compare 4 This license key has been revoked 解决办法

https://www.cnblogs.com/zhibei/p/12095431.html 错误如图所示&#xff1a; 解决办法&#xff1a; &#xff08;1&#xff09;先用find命令找到bcompare所在位置&#xff1a;sudo find /home/ -name *bcompare &#xff08;2&#xff09;进入 /home/whf/.config,删除/bco…

PBR纹理贴图类型详解

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 PBR 纹理是一种帮助 3D 艺术家使他们的 3D 渲染看起来更逼真的技术。…

JS和TS的基础语法学习以及babel的基本使用

简介 本文主要介绍了一下js和ts的基础语法,为前端开发zuo JavaScript 更详细的 JavaScript 学习资料&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/JavaScript 简介 定位 : JavaScript 是一种动态语言&#xff0c;它包含类型、运算符、标准内置&#xff08; bu…