C#9中使用静态匿名函数

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

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

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

C#9中使用静态匿名函数

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

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:faf2b018-ae39-41e1-9b3a-bf19726d3ef9

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:67710086-e8c9-4aef-9c0d-0878101ed711

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

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

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

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

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

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:2b86b46d-d679-4313-b460-2d8694442ad2

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:e5b8f85b-7d5d-411b-b428-0db0e4ec4a48

三、什么是静态匿名方法?
静态匿名函数或方法是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#&#x662F;&#x4E00;&#x79CD;&#x6D41;&#x884C;&#x7684;&#x7F16;&#x7A0B;&#x8BED;&#x8A00;&#x3002;"));
   }
   public void Display()
   {
     DisplayText(text => string.Format(formattedText, text));
     Console.Read();
   }
 }
</string,>

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

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:10c2d91f-3182-444a-9584-401b34245946

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:17dfff2d-f06d-4c19-9f5f-79f8d31e4442

C#9中使用静态匿名函数

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

public class Demo2
 {
   private const string formattedText = "{0} &#x662F;&#x7531;&#x5FAE;&#x8F6F;&#x5728;2000&#x5E74;&#x5F00;&#x53D1;&#x7684;&#x3002;";
   void DisplayText(Func<string, string> func)
   {
     Console.WriteLine(func("C#&#x662F;&#x4E00;&#x79CD;&#x6D41;&#x884C;&#x7684;&#x7F16;&#x7A0B;&#x8BED;&#x8A00;&#x3002;"));
   }
   public void Display()
   {
     DisplayText(static text => string.Format(formattedText, text));
     Console.Read();
   }
 }
</string,>

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

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

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

Original: https://www.cnblogs.com/LaoPaoEr/p/14495163.html
Author: 无昵称老炮儿
Title: C#9中使用静态匿名函数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/562362/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球