C# 回调-方法(Funccallback)与方法(Funccallback,objectstate)-有什么区别?

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"); });

假设我想在web应用程序中向HTTP请求添加一个响应头。我可以通过两种方式做到这一点:

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捕获的简单性是很有价值的。