另一个方法内部委托定义的开销
Overhead of delegate definition inside of another method
我很想知道在这种情况下幕后发生了什么:
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 移动到它自己的静态方法中,但是在我的实际场景中,因为它是在内部定义的,所以我可以访问很多我需要进行计算的变量,否则我需要包含在外部定义的方法的签名。也许这只是一个微优化,但我想更好地了解编译器如何处理这些类型的语句。
实际的 lambda 将导致在编译时创建一个新的命名方法(您只是不知道该名称是什么)(确切的语义将根据某些具体情况而有所不同)。
每次调用该方法时唯一要做的工作是创建一个新的委托对象,该对象有自己的指向相同命名方法的指针。如果构建一个对象实例对您来说真的太多了(提示:不是)那么您可以通过从方法中提取委托来节省这项工作。
我很想知道在这种情况下幕后发生了什么:
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 移动到它自己的静态方法中,但是在我的实际场景中,因为它是在内部定义的,所以我可以访问很多我需要进行计算的变量,否则我需要包含在外部定义的方法的签名。也许这只是一个微优化,但我想更好地了解编译器如何处理这些类型的语句。
实际的 lambda 将导致在编译时创建一个新的命名方法(您只是不知道该名称是什么)(确切的语义将根据某些具体情况而有所不同)。
每次调用该方法时唯一要做的工作是创建一个新的委托对象,该对象有自己的指向相同命名方法的指针。如果构建一个对象实例对您来说真的太多了(提示:不是)那么您可以通过从方法中提取委托来节省这项工作。