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

时间:2017-03-30 08:24:42

标签: c# closures resharper

今天我面临以下情况

$(".form")
      .on('invalid', function () {
        var invalid_fields = $(this).find('[data-invalid]');
        console.log(invalid_fields);
      })
      .on('valid', function () {
          var theForm = this;
          $.blockUI({ 
              message: $('#message'), 
              css: { top: '20%', width: '80%', height: '50%', left: '10%', border: 'none', background: 'none' },
              timeout: 17000,
              onUnblock: function() { theForm.submit(); } 
          });
        return false;        
      })
      .on('submit', function(){
        return false;
      });

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

我正在使用ReSharper Ultimate 2016.2.2

1 个答案:

答案 0 :(得分:5)

认为 resharper告诉你的是,这两个闭包捕获你的代码认为它没有使用的其他东西在那个lambda。第一个闭包使用previewFileNamethis(对于字段_userService),所以你对它们的捕获显然是故意的 - 但是:你可能也不明白你也在捕捉previewFile。捕获其他内容的原因是因为捕获的项的范围是相同的,因此编译器生成一个闭包以捕获所有previewFilethis,{{ 1}}和previewFileName - 封闭实例有两个方法 - 一个用于fillModelAction,另一个用于Func<string[], T>。请注意,两个lambdas都使用Action<List<StreamWithFileName>>,因此:没有警告。

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