lambda每次调用时都会创建一个新实例吗?

Joe*_*nez 5 c# lambda xna garbage-collection

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

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

InputManager.GamePads.ButtonPressed(Buttons.A, s => s.MoveToScreen<NextScreen>());
Run Code Online (Sandbox Code Playgroud)

Mic*_*lGG 4

是的,它会在以下情况下缓存它们:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

输出 10、20、true。