另一种方法内部的委托定义的开销

时间:2015-01-14 17:40:43

标签: c# performance anonymous-function

我很想知道在这种情况下幕后发生了什么:

public static void OuterMethod() {
    // some random code
    var a = 42;
    var b = "meaning of life";        

    Func<string, object> factory = (aString) {
        // do something with a and b
        return "Hello World";
    };

    // some more random code
    factory("My string");
}

我对经常调用OuterMethod的情况特别感兴趣。就我而言,它是MVC请求管道,其中OuterMethod为每个请求调用一次。

每次调用方法时都需要构建factory,这会产生很多开销吗?我可以轻松地将OuterMethod之外的Func移动到它自己的静态方法中,但是在我的实际场景中,因为它在内部定义,我可以访问我需要进行计算的许多变量,否则我需要包含在外部定义的方法的签名。也许这只是一个微优化,但我想更好地理解编译器如何处理这些类型的语句。

1 个答案:

答案 0 :(得分:2)

实际的lambda将导致在编译时创建一个新的命名方法(你只是不知道该名称是什么)(确切的语义将根据一些细节而变化)。

在每次调用方法时所做的唯一工作是创建一个新的委托对象,该对象具有指向同一命名方法的指针。如果为你构建一个对象实例真的(提示:它不是),那么你可以通过从方法中提取委托来保存该工作。