1

我在类似单例的类中有以下代码:

    private readonly Lazy<IWindsorContainer> LazyContainer =
        new Lazy<IWindsorContainer>(() => new WindsorContainer().Install(new WindsorInstaller()));

并且鉴于 WindsorContainer 确实需要发布,我稍后会在主机中这样做,所以我很自然地想压制关于 IDisposable 的顽皮 Microsoft.Reliability 警告可能没有发布。问题是它是在 lambda 内部创建的,看起来 SuppressMessage 对它没有影响,我绝对不希望它出现在整个班级。

我通过抑制构造函数上的属性来解决这个问题。但仍然对此并不完全满意。

我是否遗漏了什么或 SuppressMessage 没有赶上 c# 的发展?

4

2 回答 2

2

我认为它正在考虑对 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; });
于 2012-11-23T12:22:21.873 回答
0

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

于 2012-11-26T10:14:57.427 回答