我很想知道 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/