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

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

一、匿名方法

1.1 匿名方法定义

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


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

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

示例如下:

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关键字创建无返回值的匿名方法

示例如下:

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

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

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);
}

隐式输入参数匿名函数

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表达式中未使用的参数

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表达式表示匿名方法

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.IEnumerable和System.Collections.Generic.IEnumerable<T>类型。


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


2.2 编译时的扩展方法

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


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

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

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;
     }
}
目录
相关文章
|
1月前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
51 5
|
3月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
109 0
|
2月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
56 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
1月前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
37 3
|
23天前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
46 0
|
5月前
|
SQL 缓存 开发框架
分享一个 .NET EF6 应用二级缓存提高性能的方法
分享一个 .NET EF6 应用二级缓存提高性能的方法
|
4月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
4月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
124 3
|
3月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
4月前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
116 4

热门文章

最新文章