1

シングルトンのようなクラスに次のコードがあります。

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

WindsorContainerを実際にリリースする必要があることを考えると、後でホストでリリースするので、当然、いたずらなMicrosoftを抑制したいと思います。IDisposableに関する信頼性の警告はおそらくリリースされていません。問題は、それがラムダ内で作成され、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が正しく指摘しているように、これは新しいWindsorContainer()。Install(new WindsorInstaller())を呼び出すことであり、メンバー変数に保存される前にIDisposableを使用します(したがって、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 に答える