2016-11-21 3 views
0

私はSqlConnectionを使用してデータアクセスを実行するクラスを持っています。私たちは皆知っているようにIDisposableを実装しています。これはfinallyブロックまたはusingステートメントで処理する必要があります。私はブロックを使用してそれらを持っているが、私のIDisposableは実際に別の機能で作成されます。このように:このIDisposableは、適切に処分されている関数から返されますか?

public class DataRepository 
{ 
    private readonly SqlConfiguration _configuration; 

    public DataRepository(SqlConfiguration configuration) 
    { 
     _configuration = configuration; 
    } 

    public void Save(Model someModel) 
    { 
     using(var connection = CreateSqlConnection()) 
     { 
      // Use connection here 
     } 
    } 

    public Model Get(int id) 
    { 
     using(var connection = CreateSqlConnection()) 
     { 
      // Use connection here 
     } 
    } 

    private SqlConnection CreateSqlConnection() 
     => new SqlConnection(_configuration.ConnectionString); 
} 

あなたが見ることができるように、私はすべての私のSqlConnection年代の取り扱いステートメントを使用して持っています。 CreateSqlConnectionがusingステートメントの外で呼び出される場所はありません。しかし、私はコードクラッカーロスリンアナライザを使用していますし、それは私のCreateSqlConnectionことに私にCC0022警告を与えている:

SqlConnectionオブジェクトを配置する必要があります。

私はSqlConnectionが処分されていることを適切に確認しましたか?この場合、コードアナライザは間違っていますか?

+1

はい、その中であればブロックを使用すると、それは廃棄されます。 – Igor

+0

'CreateSqlConnection'の名前を' GetSqlConnection'に変更してみましょう。私は特定のルールは、あなたのメソッドの名前についても細心の注意を払っていると思います。 –

+4

は私によく見えます。私はroslynアナライザは、それが処分されないための "可能性"を見ていると想定しています。それは、何かが呼び出せるメソッドにあり、 "CreateSqlConnection"内で処分されないためです。あなたがしたことで私は安全に見えます。 – Skintkingle

答えて

1

このように見えるのは、コードクラッカーに取り組んでいる人々の意図的な決定です。一般的に、オブジェクトの全寿命を知ることはできないため、CC0022の診断が向上します。バグトラッカーのthis discussionを参照してください。この場合、明らかに

あなたはそのオブジェクトのすべての呼び出しの寿命を知ることができますが、コードアナライザでただ一歩あまり考えられていたことを実行することができる...

関連する問題