据我所知,在resharper建议中“隐式捕获闭包:这个”,this
指的是HomeController
类的实例。现在的问题是为什么以下解决方案能够解决问题并删除Resharper建议。
public class HomeController : Controller
{
private ExcelDocument _excelDoc = new ExcelDocument();
private IDatabase _database = new CoreDatabase();
[HttpPost]
public JsonResult Insert(HttpPostedFileBase file, int programId)
{
_excelDoc.ReadData(firstDataRowIdx: 1, headerRowIdx: 0, excelFile: file);
_excelDoc.CompareToDatabaseCodes(_database.
.GetCodesWhere(c => c.ProgramID == programId && c.Active)// In this lambda Resharper says: 'Implicitly captured closure: this'
.Select(rc => rc.Code)
.ToList());
_excelDoc.InsertTireIds(_database
.GetTiersWhere(t => t.ProgramID == programId && _excelDoc.DistinctTiers.Contains(t.Tier)));
//More code...
}
}
我找到了两种方法来删除Resharper的建议而没有真正理解这些修复背后的原因。
将programId参数分配给局部变量,如下所示:
[HttpPost]
public JsonResult Insert(HttpPostedFileBase file, int programId)
{
_excelDoc.ReadData(firstDataRowIdx: 1, headerRowIdx: 0, excelFile: file);
// Fix
int selectedProgramId = programId;
_excelDoc.CompareToDatabaseCodes(_database.
.GetCodesWhere(c => c.ProgramID == selectedProgramId && c.Active)// In this lambda Resharper says: 'Implicitly captured closure: this'
.Select(rc => rc.Code)
.ToList());
_excelDoc.InsertTireIds(_database
.GetTiersWhere(t => t.ProgramID == selectedProgramId && _excelDoc.DistinctTiers.Contains(t.Tier)));
//More code...
}
将_excelDoc.DistinctTiers(在第二个lambda中)分配给局部变量:
[HttpPost]
public JsonResult Insert(HttpPostedFileBase file, int programId)
{
_excelDoc.ReadData(firstDataRowIdx: 1, headerRowIdx: 0, excelFile: file);
_excelDoc.CompareToDatabaseCodes(_database.
.GetCodesWhere(c => c.ProgramID == programId && c.Active)// In this lambda Resharper says: 'Implicitly captured closure: this'
.Select(rc => rc.Code)
.ToList());
// Fix
List<int> distinctTiers = _excelDoc.DistinctTiers;
_excelDoc.InsertTireIds(_database
.GetTiersWhere(t => t.ProgramID == programId && distinctTiers.Contains(t.Tier)));
//More code...
}
请帮助我理解为什么我的修复工作正常。
如果需要更多信息来更好地解释问题,请告诉我。
感谢!!!
答案 0 :(得分:0)
这意味着您在lamda表达式中包含该类中的字段。因为Resharper不知道lamda将用于什么,所以不能确定它不会超出方法调用的范围。例如,如果将lamda分配给另一个类的某个长期存在的字段,它将引用this._excelDoc的当前值 - 可能同时已更改,或设置为null等... < / p>
Resharper只是告诉你lamda的生命周期不应该超出方法的范围,否则它将继续在_excelDoc上运行,如此实例所引用的那样。