2012-11-23 128 views
1

我有以下的單身般類的代碼:禁止Microsoft.Reliability警告在λ

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

,並考慮到WindsorContainer確實需要釋放我做的是,在主機後自然就會去」 D喜歡壓制關於IDisposable的頑皮的Microsoft.Reliability警告可能沒有發佈。問題是它是在lambda內部創建的,看起來像SuppressMessage對它沒有影響,我絕對不希望它在整個類上。

我已經在構造函數中抑制了屬性。但仍然不完全滿意。

我錯過了什麼或SuppressMessage沒有趕上c#的進化?

回答

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; }); 
+0

你是對的。這是關於變量未分配但已經使用的實例恐慌。 – durilka

0

由於fsimonazzi正確地指出,這是關於調用新的WindsorContainer()。安裝(新的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:在所有對它的引用超出範圍之前處理對象」。是破碎的,可以忽略和壓制,情況並非總是如此。