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
我认为 resharper告诉你的是,这两个闭包还捕获了你的代码认为它在lambda 中没有使用的其他东西.第一个闭合使用previewFileName和this(对于场_userService),所以你对它们的捕获显然是故意的 - 但是:你可能并不明白你也在捕捉previewFile.您捕捉更多的事情的原因是因为该范围捕获的项目是一样的,所以编译器生成一个单一的封闭来捕获所有的previewFile,this,previewFileName和fillModelAction-与封闭实例有2种方法-一个用于Func<string[], T>和一个用于Action<List<StreamWithFileName>>.请注意,previewFileName两个lambda都使用,所以:没有警告.
理解这一点对于垃圾收集的原因可能很重要 - 如果一个lambda比另一个生存的时间长得多,你可能不想意外地保留其他东西,因此警告.例如,fillGraphicContentActionlambda保持整个this活着(无论this是什么),即使lambda不使用this.