匿名函数是很早以前在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. k8s-修改线程数

    1.背景: (1)胖容器ssh登录报错:handshake error (2)登录宿主机后,观察pod状态为running,但是kubectl exec 和docker exec 均无法进入该容器,报 ...

  2. VA21 创建报价单

    1.前台 报价是提供给客户交付货物或服务的一份文件,客户想要知道产品价格以及装运时间. 事务代码VA21 输入报价单类型和销售组织.分销渠道.产品组 输入售达方和行项目的物料信息,订购数量等信息 输入 ...

  3. C++ Idioms Pimpl

    References C++ Coding Standard 這本書的中文版不知道是不是翻譯問題,還是原作就有這種傾向,有些咬文嚼字的很不好懂. Exceptional C++ 這本比上面那本容易理解 ...

  4. MAVEN 配置和基本使用

    Maven 安装配置 解压 apache-maven-3.6.1.rar 既安装完成 配置环境变量 MAVEN_HOME 为安装路径的 bin 目录 在 Path 下添加 %MAVEN_HOME%\b ...

  5. Codeforces Round #624 (Div. 3) (A~D,CD Good)

    比赛链接:Here 1311A. Add Odd or Subtract Even 签到题, \(a > b\) 时必须做做减法,如果差值为偶数的话只需要 \(1\) 次不然做一次减法后再做一次 ...

  6. Android 加载图片占用内存分析

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/aRDzmMlkqB14Ty67GJs9vg作者:Xu Jie 不同Android版本,对一张图 ...

  7. 数字孪生智慧物流之 Web GIS 地图应用

    前言 随着数字经济时代的来临,新一轮全球化进程速度加快,在大数据.人工智能.物联网等高新技术深度融合下,加快催化智慧物流发展,引领物流行业划入全新时代. 从物流运输到货物分拣再到站点配送,图扑软件数据 ...

  8. <vue 路由 8、keep-alive的使用>

    一.     知识点 1.什么是keep-alive? keep-alive是Vue.js的一个内置组件. 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们.它自身不会渲染一个 DOM 元素,也 ...

  9. P1825 诡异的题

    一道不难的题,可是挑了好久也没调好!因为最开始写的代码太复杂了,一大堆嵌套括号,其中有一个ny写成了nx一直没发现.后来用新定义变量取代了那些复杂的用函数."."和方括号表达出来的 ...

  10. java进阶(25)--泛型

    一.泛型基本概念 JDK5.0后新特性:Generic 1.不使用泛型举例