【问题标题】:Suppress Microsoft.Reliability warning on lambda抑制 lambda 上的 Microsoft.Reliability 警告
【发布时间】: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# 的发展步伐?

【问题讨论】:

    标签: c# idisposable fxcop


    【解决方案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:在所有对它的引用超出范围之前处理对象”。坏了,可以忽略和压制,但并非总是如此。

    【讨论】:

      猜你喜欢
      • 2015-03-17
      • 2011-03-31
      • 2019-10-22
      • 2014-12-19
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      相关资源
      最近更新 更多