2013-03-01 174 views
6

それは重要ではありませんが、私はそれが私に何を伝えているのか把握しようとしており、正当な警告ですか?誰かが私にこのエラーを簡単に説明できますか? 'CongressDBEntities':使い捨てのフィールドを所有しCA1001 Visual Studio 2012コード分析の警告。どういう意味ですか?

CA1001タイプは、それが 次IDisposableインタータイプのメンバーを作成するため、

は 'MemVoteManager' にIDisposableを実装を使い捨てにする必要があります。 「MemVoteManager」 が以前に出荷された場合、このタイプにIDisposable を実装する新しいメンバを追加することは、既存の コンシューマへの急変と考えられます。

public class MemVoteManager : AbstractDataManager, IMemVoteManager 
{ 
    private CongressDBEntities context = new CongressDBEntities(); 

    public int AddMemVote(tMemVoteScore mvs) 
    { 
     //Insert Model 
     context.tMemVoteScores.Add(mvs); 
     context.SaveChanges(); 

     int newPK = mvs.MemVoteScoresID; 

     //Update funky column ID with PK as well 
     var memVoteItem = (from m in context.tMemVoteScores 
          where m.MemVoteScoresID == newPK 
          select m).SingleOrDefault(); 

     memVoteItem.ID = memVoteItem.MemVoteScoresID; 
     context.SaveChanges(); 
     return newPK; 
    } 
+3

警告を繰り返すだけでなく、警告があなたに指示する内容を説明することは難しいでしょう。あなたの型にはオブジェクトが構築され、そのオブジェクトにIDisposableを実装するフィールドがあるので、その型にIDisposableを実装し、そのフィールドにオブジェクトを配置する必要があります。それは基本的に警告が言うものです。あなたのタイプを使用している既存のコードは、 'Dispose'を念頭に置いて作成されていないため、その変更が急激に変化するということです。 –

答えて

7

だから、のようなあなたのコードを変更コンシューマーがあなたのクラスで終わったときに、あなたがクラスのメンバーであるというコンテキストを持たないほうが良いかもしれません。ちょうどあなたがそれを必要なときにそれを作成し、完了したら、それを処分:

public int AddMemVote(tMemVoteScore mvs) 
{ 
    //Insert Model 
    using(CongressDBEntities context = new CongressDBEntities()) 
    { 
     context.tMemVoteScores.Add(mvs); 
     context.SaveChanges(); 

     int newPK = mvs.MemVoteScoresID; 

     //Update funky column ID with PK as well 
     var memVoteItem = (from m in context.tMemVoteScores 
          where m.MemVoteScoresID == newPK 
          select m).SingleOrDefault(); 

     memVoteItem.ID = memVoteItem.MemVoteScoresID; 
     context.SaveChanges(); 
    } 
    return newPK; 
} 

コンテキストは、軽量であるので、それらを毎回作成するための巨大なペナルティはありません。さらに、消費者がコンテキストを破棄するように通知する心配はありません。クラスの1つのインスタンスが何度も使用されていれば、メモリ内に多くのビルドアップ変更がありません。

+0

しかし、私はすべてが最終的に範囲外になった後にゴミ収集されたと思った?しかし、コード解析を幸せにするならば、上記のようにしてラップしてください。 – punkouter

+1

@punkouter、その考えられたプロセスの問題は、オブジェクトの***が決してガベージコレクションに到達しないということです。メモリ管理は、.NETで自動化されていますが、無意味ではありません。永遠に存在するオブジェクトによっても参照される別のクラスへの参照を持つクラスを考えてみましょう。私はそれが端のように思えることは知っていますが、そうではありません。 ***これらのオブジェクトはどれも***アプリケーションがシャットダウンされるまでガベージコレクションされません。 –

+0

だから私はDisposableを実装し、それを呼び出すことは、クラスがガベージコレクションされることを確実にする方法です...今は必要ないかもしれませんが、それはちょうど – punkouter

3

あなたがフィールドcontextは使い捨てのメンバーが含まれていることを知らせています。つまり、それらのメンバーは、Dispose()を呼び出す必要があるため、ガベージコレクションが実行されます。したがって、コンテキストをMemVoteManagerに実装して、コンテキスト上でDispose()を呼び出したり、使い捨てのメンバーを呼び出すことができます。このようIDisposableインターフェイスのメンバーを実装し、その後

public class MemVoteManager : AbstractDataManager, IMemVoteManager, IDisposable 

をして:あなたはので、コンテキストが処分されるIDisposableを実装することができ

public void Dispose() 
{ 
    // call dispose on the context and any of its members here 
} 
+0

Idisposableを実装するクラス内のどのクラスも、iDisposableも実装する必要があることを意味しますか?それがなければ、メモリリークを作成できますか?上記のように私はすべてガベージコレクトされていますが、マネージコードです! – punkouter

+0

@punkouter、クラスが 'IDisposable'を実装している場合は、明示的に、それを取り除くためのアンマネージドリソースがあることを意味します。例えばデータベース接続***(実際の接続)*** - これは管理されていないリソースです。したがって、管理対象リソースにつながる他のオブジェクトを持つコンテキストオブジェクトがあるため、** Dispose()が呼び出されていることを確認する必要があります。 –

+0

しかし、 'using'を使用してDBcontextをラップすることは、idisposableを実装することと同じですか? – punkouter

関連する問題