修复Resharper的“隐式捕获闭包:这个”

时间:2018-01-05 19:46:16

标签: c# lambda this resharper

据我所知,在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的建议而没有真正理解这些修复背后的原因。

  1. 将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...
    }
    
  2. 将_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...
    }
    
  3. 请帮助我理解为什么我的修复工作正常。

    如果需要更多信息来更好地解释问题,请告诉我。

    感谢!!!

1 个答案:

答案 0 :(得分:0)

这意味着您在lamda表达式中包含该类中的字段。因为Resharper不知道lamda将用于什么,所以不能确定它不会超出方法调用的范围。例如,如果将lamda分配给另一个类的某个长期存在的字段,它将引用this._excelDoc的当前值 - 可能同时已更改,或设置为null等... < / p>

Resharper只是告诉你lamda的生命周期不应该超出方法的范围,否则它将继续在_excelDoc上运行,如此实例所引用的那样。