c# - lambda 是否在每次调用时都创建一个新实例?

标签 c# lambda xna garbage-collection

我很想知道 Lambda(当用作委托(delegate)时)是否会在每次调用时创建一个新实例,或者编译器是否会想出一种方法来仅实例化委托(delegate)一次并传入该实例。

更具体地说,我想为 XNA 游戏创建一个 API,我可以使用 lambda 传递自定义回调。由于这将在 Update 方法中调用(每秒调用多次),如果它每次都更新一个实例以传递给委托(delegate),那将是非常糟糕的。

InputManager.GamePads.ButtonPressed(Buttons.A, s => s.MoveToScreen<NextScreen>());

最佳答案

是的,它会在可能的时候缓存它们:

using System;

class Program {
    static void Main(string[] args) {
        var i1 = test(10);
        var i2 = test(20);
        System.Console.WriteLine(object.ReferenceEquals(i1, i2));
    }

    static Func<int, int> test(int x) {
        Func<int, int> inc = y => y + 1;
        Console.WriteLine(inc(x));
        return inc;
    }
}

它创建一个静态字段,如果它为空,则用一个新委托(delegate)填充它,否则返回现有委托(delegate)。

输出 10、20、true。

关于c# - lambda 是否在每次调用时都创建一个新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1135165/

相关文章:

c# - 从列表创建敌人

c# - XNA中如何控制高清视频播放的位置和速度?

python - map() 中带有 if 条件的 Lambda

java - 有什么方法可以让我的 JavaFX 代码更加清晰吗?

c# - XNA 内容加载异常

c# - .Net 4.0并行编程-如何将数据写入并发集合?

javascript - 使用 ASP.NET 和 C# 将文件上传到服务器

c# - 特定 WInForm 的缩放错误

c# - 新的 MVC Area _layout 不继承....System.Web.WebPages.StartPage

c# - 这两种说法有什么区别?