抑制 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 警告的主要内容,如果未能解决你的问题,请参考以下文章

抑制php上的mysql错误

为啥 asyncio 的事件循环会抑制 Windows 上的 KeyboardInterrupt?

抑制 PL/SQL 代码上的声纳问题

抑制后续行上的重复值

抑制 PC 上的滑动事件

抑制节点窗体上的输入格式选项