web-dev-qa-db-ja.com

コード分​​析警告CA2213-IDisposableバッキングフィールドでDispose()を呼び出します

質問を書いているときに理解したのに、これを投稿したかった。以下に回答を掲載します。

VSコード分析で次の警告が表示されます。

警告CA2213'DBConn 'には、IDisposableタイプのフィールド' DBConn.k__BackingField 'が含まれています:' SqlConnection '。 'DBConn'のDisposeメソッドを変更して、このフィールドでDisposeまたはCloseを呼び出します。

しかし、私のコードdoes DBConnプロパティでDispose()を呼び出します。バッキングフィールドではありませんか?私はこのような他のインスタンスを持っています-コンパイラがこの警告をスローしない場所を処分しています。これは以下のコードです:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;    

namespace TheProgramSpace
{
    public sealed class DBConn : IDisposable
    {
        // class containing the database and its connection
        public SqlConnection TheConn { get; }
        public string DbPath { get; }
        public string DbName { get; }


        public DBConn(ProgInstance FPI)
        {
            // constructs new SQLConnection            
            DbPath = FPI.dbPath;
            DbName = FPI.dbName;

            string connString = "Data Source = " + DbPath + "; Initial Catalog =" + DbName + "; Integrated Security = True; "
              + "Connect Timeout = 30; Encrypt = False; TrustServerCertificate = False; "
              + "ApplicationIntent = ReadWrite; MultiSubnetFailover = False";                     

            TheConn = new SqlConnection(connString);

        }

        public void Dispose()
        {            
            TheConn.Dispose();            
        }
    }
}
16
dashnick

コードに問題はありません。 Disposewillは、基になるバッキングフィールドで呼び出されます。これは、C#6で導入された「getter-only」自動プロパティの導入で表面化したFxCopの 既知のバグ です。今のところ、 警告を抑制する クラスに属性を指定するか、FxCopで修正されるまで無視します。

18
D Stanley

その理由は、TheConnには、setアクセサーがなかったため、読み取り専用であったためです。プロパティ宣言をに変更する

public SqlConnection TheConn { get; private set; }

問題を解決しました。

15
dashnick