C# 回调-方法(Funccallback)与方法(Funccallback,objectstate)-有什么区别?
假设我想在web应用程序中向HTTP请求添加一个响应头。我可以通过两种方式做到这一点:C# 回调-方法(Funccallback)与方法(Funccallback,objectstate)-有什么区别?,c#,C#,假设我想在web应用程序中向HTTP请求添加一个响应头。我可以通过两种方式做到这一点: var httpContext = GetHttpContext(); // No state object - OnStarting(Func<Task> callback) httpContext.Response.OnStarting(state => { httpContext.Response.Headers.Add("My-Header", "value"); });
var httpContext = GetHttpContext();
// No state object - OnStarting(Func<Task> callback)
httpContext.Response.OnStarting(state =>
{
httpContext.Response.Headers.Add("My-Header", "value");
});
// Use state object - OnStarting(Func<object, Task> callback, object state);
httpContext.Response.OnStarting(state =>
{
var headers = (IHeaderDictionary)state;
headers.Add("My-Header", "value");
}, httpContext.Response.Headers);
这些方法中的一种应该优先于另一种吗?如果是,原因是什么?这是一个不同的
在第一个场景中,编译器创建一个匿名类,创建其实例以捕获httpContext的值
在第二个场景中,lambda被转换为纯静态方法,因此不创建任何实例。这意味着生成的代码更简单,垃圾收集器的影响更小
首选项实际上是关于性能和GC优化的
编译器将如何翻译操作码:
无状态和捕获:
class _anonymousClass
{
private HttpContext httpContext;
public _anonymousClass(HttpContext httpContext)
{
this.httpContext = httpContext;
}
public void Callback()
{
this.httpContext.Response.Headers.Add("My-Header", "value");
}
}
var httpContext = GetHttpContext();
// No state object - OnStarting(Func<Task> callback)
httpContext.Response.OnStarting(new _anonymousClass(httpContext).Callback);
有状态和无捕获:
private void _anonymousCallback(object state)
{
var headers = (IHeaderDictionary)state;
headers.Add("My-Header", "value");
}
// Use state object - OnStarting(Func<object, Task> callback, object state);
httpContext.Response.OnStarting(_anonymousCallback, httpContext.Response.Headers);
听起来似乎没有什么理由使用第一个选项——代码更容易阅读,但仅此而已。“你同意吗?”詹姆斯两人都有自己的长处。当性能不受关注时,使用lambda捕获的简单性是很有价值的。