匿名函数是很早以前在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个堆分配。
[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#是一种流行的编程语言。"));
}
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
要禁止分配,可以在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();
}
}
</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/
转载文章受原作者版权保护。转载请注明原作者出处!