匿名函数是很早以前在C#编程语言中引入的。尽管匿名功能有很多好处,但它们并不便宜。避免不必要的分配很重要,这就是为什么在C#9中引入静态匿名函数的原因。在C#9中,lambda或匿名方法可以具有静态修饰符。

本文讨论了静态匿名函数,以及为什么有用,并通过代码示例来说明这些概念。若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。如果您还没有副本,则可以在此处下载> Visual Studio 2019

一、在Visual Studio中创建控制台应用程序项目

首先,让我们在Visual Studio中创建一个.NET Core控制台应用程序项目。这将在Visual Studio 2019中创建一个新的.NET Core控制台应用程序项目。我们将在本文的后续部分中使用此项目。

二、匿名方法并不简单

您有调用代理的开销。例如,如果您的lambda捕获了封装方法的局部变量或参数,则将有两个堆分配-一个分配给委托,另一个分配给闭包。或者,如果您的lambda仅捕获一个封闭的实例状态,则将仅产生一个委托分配,并因此产生一个堆分配。如果您的lambda不捕获任何内容,或仅捕获静态状态,则将产生0个堆分配。

让我们通过一个例子来理解这一点。请考虑以下代码片段,该代码片段说明了如何在代码中意外分配。

int y = 1;
MyMethod(x => x + y);

上面的代码倾向于捕获y,从而导致意外分配。

您可以利用const和static关键字来防止这种不必要的分配,如下面的代码段所示。

const int y = 1;
MyMethod(static x => x + y);

为了避免不必要和浪费的内存分配,我们可以在lambda上使用static关键字,并在不想捕获的变量或对象上使用const关键字。请注意,静态匿名函数无法从封闭范围访问本地,参数或“ this”实例,但它们可以从封闭范围引用静态成员以及常量定义(请参阅Microsoft文档)

接下来的部分将更详细地说明静态匿名函数。

三、什么是静态匿名方法?

静态匿名函数或方法是C#9中匿名函数的改进。您现在可以使用static关键字创建静态匿名函数。

应用于lambda或匿名函数的静态修饰符称为静态匿名函数。静态匿名方法可以引用静态成员,也可以引用封闭范围中的常量对象。

应当注意,静态匿名方法无法从封闭范围捕获状态。这意味着不能从静态匿名函数中访问与封闭范围有关的局部变量,参数和“this”实例。非静态本地方法能够从封闭的静态匿名方法捕获状态信息,但无法捕获封闭的静态匿名函数之外的状态。

请参考以下代码片段。

class Program
{
static void Main(string[] args)
{
new Demo().Display();
Console.Read();
}
}
public class Demo
{
private string formattedText = "{0} 是由微软在2000年开发的。";
void DisplayText(Func<string, string> func)
{
Console.WriteLine(func("C#是一种流行的编程语言。"));
}
public void Display()
{
DisplayText(text => string.Format(formattedText, text));
Console.Read();
}
}

变量formattedText将由名为DisplayText的匿名方法捕获,这又将导致您可能不需要的内存分配。

当您执行上述程序时,输出将显示在控制台窗口中,如下图所示。

要禁止分配,可以在formattedText变量上使用const关键字,在lambda函数上使用static修饰符,如下面的代码片段所示。

public class Demo2
{
private const string formattedText = "{0} 是由微软在2000年开发的。";
void DisplayText(Func<string, string> func)
{
Console.WriteLine(func("C#是一种流行的编程语言。"));
}
public void Display()
{
DisplayText(static text => string.Format(formattedText, text));
Console.Read();
}
}

在Lambda或匿名方法上使用静态修饰符的功能是C#9中新增的功能。当您将静态修饰符添加到Lambda或匿名方法时,lambda或匿名方法被称为静态匿名函数。 。

您可以在lambda或匿名方法上利用static修饰符,以确保您不会无意中从封闭的上下文中捕获本地或实例状态。这对于提高应用程序的性能非常友好。

转载于https://www.infoworld.com/article/3609850/how-to-work-with-static-anonymous-functions-in-csharp-9.html

C#9中使用静态匿名函数的更多相关文章

  1. Java中的lambda匿名函数使用

    Java中的lambda匿名函数使用 lambda匿名函数的使用是为了满足某些情况下需要临时定义函数,或者事先定义,需要时才使用.在python里面,lambda表达式的表达方式为:lambda 参数 ...

  2. js 函数中的 return+匿名函数

    今天一个刚学js的朋友给了我一段代码问为什么方法不执行,代码如下: 代码如下: function makefunc(x) {  return function (){   return x;  } } ...

  3. 在PHP中如何为匿名函数指定this?

    在之前的文章中,我们已经学习过匿名函数的使用,没有看过的小伙伴可以进入传送门先去了解下闭包匿名函数的用法,传送:还不知道PHP有闭包?那你真OUT了. 关于闭包匿名函数,在JS中有个很典型的问题就是要 ...

  4. C#中委托,匿名函数,lamda表达式复习

    一.委托 1.就给类比较,类用class声明,委托用delegate声明. 2.委托要指向一个真正的方法. 3.委托的签名,要和指向的方法一样. //1.声明一个委托 public delegate ...

  5. C#中委托、匿名函数、Lambda表达式的一些个人理解

    0x01定义一个委托,相当于定义一个可以存储方法的特殊变量类型 下面我们看具体的代码,通过代码更好理解 delegate void IntMethodInvoker(int x); 这行代码就是声明一 ...

  6. .net 中写 psql 匿名函数、过程语言

    DO --关键字 $serch$ --$中间随便写, 不能用特殊符号和数字好像$ DECLARE times integer; --定义变量 rec history_depart%ROWTYPE; - ...

  7. Java中的Lambda匿名函数后续

    函数式编程(函数式接口):一个接口只包含一个方法实现 public interface Lambda{ void method(); } // 调用 Lambda lambda = new Lambd ...

  8. python之匿名函数以及在内置函数中的使用

    一. 匿名函数 Python使用 lambda 来创建匿名函数.所谓匿名函数,它与用 def 关键字定义的函数相比,没有函数名称. 1.1 匿名函数定义及特点 语法: lambda [para1, p ...

  9. Python中的匿名函数lambda的用法

    一.lambda函数的简介  对lambda函数,它其实是一个类似于def的函数,只不过lambda是一个不需要定义函数名的匿名函数.当我们在有些时候,需要做一些简单的数学计算时,如果定义一个def函 ...

  10. python中匿名函数lambda如何用

    python中经常用到的一个函数:匿名函数lambda ,什么是匿名函数?匿名函数的意义是什么?匿名函数怎么样用?(疑问三连,what,why,how) 一,什么是匿名函数? python中没有名字的 ...

随机推荐

  1. 神经网络优化篇:详解RMSprop

    RMSprop 知道了动量(Momentum)可以加快梯度下降,还有一个叫做RMSprop的算法,全称是root mean square prop算法,它也可以加速梯度下降,来看看它是如何运作的. 回 ...

  2. 你想怎么使用 Serverless 函数计算?(评测赢好礼 )

    随着云计算发展,云原生热度攀升,Serverless 架构崭露头角且发展势头迅猛.不仅被更多开发者所关注,市场占有率也逐年提高.阿里云函数计算(Function Compute)是一个事件驱动的全托管 ...

  3. 移动端h5中rem适配

    1 (function (win, lib) { 2 var doc = win.document; 3 var docEl = doc.documentElement; 4 var metaEl = ...

  4. mixin混合

    多个组件有相同的逻辑,抽离出来 mixin并不是完美的解决方案,会有一些问题 vue3提出composition api旨在解决这些问题

  5. Ceph学习笔记(1)- 架构概述

    简介 Ceph的目标是采用商业硬件来构建大规模的.具有高可用.高扩展.高性能的分布式存储系统,ceph具有如下特点: 软件定义存储:Ceph不需要特定的硬件,在主流的Linux发行版等类Unix操作系 ...

  6. SpringCloud对使用者透明的数据同步组件

    一.背景 云端使用Spring Cloud实现,A服务有一些数据,B和C服务也需要A服务的这些数据,但是系统上面只有A服务有数据操作的入口,B和C服务只能从A服务处同步数据到自己的表里面. 解决方案是 ...

  7. CLion创建自定义代码模板

    1.问题 很多时候我们都想要简化代码编写,比如像IDEA那样,写入一个sout即会补全为System.out.println( |inserts cursor here| );的形式 最急切的例子便是 ...

  8. WebApi的输出结果重写 OnActionExecuted

    public override void OnActionExecuted(ActionExecutedContext context) { if (context.Exception != null ...

  9. Sonarqube 二进制的安装与简单使用

    Sonarqube 二进制的安装与简单使用 背景 使用容器安装 sonarqube 发现无法使用PG数据库 尝试了很长时间没搞定 想了想还是使用 二进制的方式进行部署吧. 下载 https://bin ...

  10. DellEMC 服务器安装ESXi的简单步骤

    DellEMC 服务器安装ESXi的简单步骤 背景 ESXi的镜像其实分为多种. 官方会发布一个版本的ISO. 然后会不定期进行升级, 解决安全,性能以及功能bug等. 7.0 为例的话 就有ESXi ...