抑制 lambda 上的 Microsoft.Reliability 警告
Posted
技术标签:
【中文标题】抑制 lambda 上的 Microsoft.Reliability 警告【英文标题】:Suppress Microsoft.Reliability warning on lambda 【发布时间】:2012-11-23 12:00:20 【问题描述】:我在类单例类中有以下代码:
private readonly Lazy<IWindsorContainer> LazyContainer =
new Lazy<IWindsorContainer>(() => new WindsorContainer().Install(new WindsorInstaller()));
鉴于 WindsorContainer 确实需要发布,我稍后会在主机中这样做,所以我很自然地想压制顽皮的 Microsoft.Reliability 关于 IDisposable 的警告可能未发布。问题是它是在 lambda 中创建的,看起来 SuppressMessage 对它没有影响,我绝对不希望它出现在整个类中。
我通过抑制构造函数的属性来解决这个问题。但仍然对此并不完全满意。
是我遗漏了什么还是 SuppressMessage 没有跟上 c# 的发展步伐?
【问题讨论】:
【参考方案1】:我认为它正在考虑对 Install() 的调用失败的可能性,然后尚未分配给任何变量的容器未被处置。您可以在此处添加 try/catch,使表达式更加冗长但符合以下规则(未经测试,但您会明白):
private readonly Lazy<IWindsorContainer> LazyContainer =
new Lazy<IWindsorContainer>(() =>
var container = new WindsorContainer();
try container.Install(new WindsorInstaller()));
catch using(container) throw;
return container; );
【讨论】:
你是对的。这完全是关于变量未分配但实例已使用的恐慌。【参考方案2】:正如 fsimonazzi 正确指出的那样,这是关于调用 new WindsorContainer().Install(new WindsorInstaller()) ,它在将 IDisposable 保存到成员变量之前使用它(因此不能保证它会永远存在)。
对于我自己,我决定将其重构为以下内容:
class Program : IDisposable
private Disposo _disposo = new Disposo();
//private Disposo _disposo = new Disposo().Yeah(); // this will cause warning
public Program()
_disposo.Yeah(); // this will not
public void Dispose()
if (_disposo != null)
_disposo.Dispose();
_disposo = null;
static void Main(string[] args)
using (var p = new Program())
class Disposo : IDisposable
public void Dispose()
public Disposo Yeah() return this;
在某个地方有
private static readonly Lazy<Program> LazyInstance = new Lazy<Program>();
道德?尽管声称“CA2000:在所有对它的引用超出范围之前处理对象”。坏了,可以忽略和压制,但并非总是如此。
【讨论】:
以上是关于抑制 lambda 上的 Microsoft.Reliability 警告的主要内容,如果未能解决你的问题,请参考以下文章