Resharper关于闭合的警告是否正确?

Ren*_*nov 5 c# resharper closures

今天我遇到了以下情况

public async Task<Stream> GetApproveDocumentAsync<T>(Guid id, int revision, PdfLayoutType pdfLayoutType, string resourceFilePath, CadDrawingType cadDrawingType, int approvalWidth, int approvalHeight, Action<T> fillModelAction = null) where T : BaseApproveModel, new() {
    var previewFileName = $"{id}_{revision}_preview.png";
    Stream previewFile;
    using (var resourceFileStream = new FileStream(resourceFilePath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true)) {
        previewFile = await _cadApiService.ConvertDrawingToImageAsync(resourceFileStream, cadDrawingType, FileFormat.EVD, FileFormat.PNG, approvalWidth, approvalHeight).ConfigureAwait(false);
    }
    Func<string[], T> createBaseApproveModelFunc = graphicContentFilenames => { //Implicitly captured closure: previewFile
         var model = new T {
             GraphicContentFiles = graphicContentFilenames,
             CadPreview = previewFileName,
             Customer = _userService.GetCurrentOverrideCustomer()?.CustomerName
         };
         fillModelAction?.Invoke(model);
         return model;
    };
    Action<List<StreamWithFileName>> fillGraphicContentAction = currentGraphicContent => { //Implicitly captured closure: fillModelAction, this
        currentGraphicContent.Add(new StreamWithFileName {FileName = previewFileName, Stream = previewFile});
    };
    return await _apagoService.ConstcutPdf(pdfLayoutType, createBaseApproveModelFunc, fillGraphicContentAction).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)

我以为我知道闭包是如何工作的,但我无法理解ReSharper的行为.ReSharper是否错误地(或错误地)交换了这两个警告?

我正在使用ReSharper Ultimate 2016.2.2

Mar*_*ell 6

认为 resharper告诉你的是,这两个闭包捕获了你的代码认为它在lambda 中没有使用的其他东西.第一个闭合使用previewFileNamethis(对于场_userService),所以你对它们的捕获显然是故意的 - 但是:你可能并不明白你也在捕捉previewFile.您捕捉更多的事情的原因是因为该范围捕获的项目是一样的,所以编译器生成一个单一的封闭来捕获所有的previewFile,this,previewFileNamefillModelAction-与封闭实例有2种方法-一个用于Func<string[], T>和一个用于Action<List<StreamWithFileName>>.请注意,previewFileName两个lambda都使用,所以:没有警告.

理解这一点对于垃圾收集的原因可能很重要 - 如果一个lambda比另一个生存的时间长得多,你可能不想意外地保留其他东西,因此警告.例如,fillGraphicContentActionlambda保持整个this活着(无论this是什么),即使lambda不使用this.