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

利用C#9中的静态匿名方法来提高.NET应用程序的性能。

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

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

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

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

首先,让我们在Visual Studio中创建一个.NET Core控制台应用程序项目。假设系统中已安装Visual Studio 2019,请按照以下概述的步骤在Visual Studio中创建一个新的.NET Core控制台应用程序项目。

  1. 启动Visual Studio IDE。
  2. 点击“创建新项目”。
  3. 在“创建新项目”窗口中,从显示的模板列表中选择“控制台应用程序(.NET Core)”。
  4. 点击下一步。
  5. 在“配置新项目”窗口中,指定新项目的名称和位置。
  6. 单击创建。

这将在Visual Studio 2019中创建一个新的.NET Core控制台应用程序项目。我们将在本文的后续部分中使用此项目。如何在C#9中使用静态匿名函数https://imasdk.googleapis.com/js/core/bridge3.446.1_en.html#goog_1937589461成交量0% 

匿名方法并不便宜

如我所说,匿名方法并不便宜。您有调用代理的开销。例如,如果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”实例。非静态本地方法能够从封闭的静态匿名方法捕获状态信息,但无法捕获封闭的静态匿名函数之外的状态。

C#9中的静态匿名方法示例

现在请参考以下代码片段。

 public class Demo
    {
        private string formattedText = "{0} It was developed by Microsoft's Anders Hejlsberg in the year 2000.";
        void DisplayText(Func<string, string> func)
        {
            Console.WriteLine(func("C# is a popular programming language."));
        }
        public void Display()
        {
            DisplayText(text => string.Format(formattedText, text));
            Console.Read();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            new Demo().Display();
            Console.Read();
        }
    }

请参考前面的代码示例中的Demo类。变量formattedText将由名为DisplayText的匿名方法捕获,这又将导致您可能不需要的内存分配。

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

静态匿名函数01

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

public class Demo
    {
        private const string formattedText = "{0} It was developed by Microsoft's Anders Hejlsberg in the year 2000.";
        void DisplayText(Func<string, string> func)
        {
            Console.WriteLine(func("C# is a popular programming language."));
        }
        public void Display()
        {
            DisplayText(static text => string.Format(formattedText, text));
            Console.Read();
        }
    }

就是这样!绝对没有分配,这正是我们想要的。

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

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

原创文章,作者:冰封一夏,如若转载,请注明出处:http://www.nncjzx.com/602.html

关注本站公众号获取更多实时内容

本站微信公众号:二线码农