【发布时间】:2018-01-11 16:42:18
【问题描述】:
编译器(我在这里松散地使用这个词,我的 VS、Roslyn、R# 工具链中的某个人)知道当我访问 lambda 表达式中的变量时,如果稍后执行可能已经被释放。这是一个很棒的功能,也是一个受欢迎的警告。但是,有时我知道 lambda 表达式会立即执行,而不是保存以供以后使用,所以这个警告是错误的。
有人可能会争辩说,编译器无法知道 lambda 表达式是否已执行或保留以供以后使用。有趣的事实:确实如此。如果我在 LinQ 语句中使用它,我会得到一条弯曲的警告线,except,因为当我立即通过调用 .ToList() 来实现该事物时。然后警告消失。因此,编译器知道 lambda 是被使用过一次然后被丢弃,还是保留以备后用。
使用波浪线访问已处置的闭包:
我如何向我的工具链解释我的方法(采用 lambda 的 .ThrownFrom()) 实际上是立即执行它并且不保留对它的引用?
我能否通过属性、模式或其他我可以设置的东西获得与物化 LinQ 相同的效果,或者是某些特定于 LinQ 的硬编码编译器魔法?
以我的忽略类为例:
public static class Ignore<TException> where TException : Exception
{
public static void ThrownFrom([NotNull] Action action)
{
if (action is null)
{
throw new ArgumentNullException(nameof(action));
}
try
{
action();
}
catch (TException ex)
{
// ignore
}
}
}
【问题讨论】:
-
然后关掉R#;)
-
您可以在
// ReSharper disable once AccessToDisposedClosure行前添加注释来禁用此功能。不过感觉有点恶心。
标签: c# lambda compiler-warnings code-analysis