代码分析警告CA2213 - 在IDisposable支持字段上调用Dispose()

das*_*ick 15 c# fxcop visual-studio c#-6.0 visual-studio-2015

想发布这个,即使我在写这个问题的过程中弄清楚了.将在下面发布答案.

使用VS代码分析获得以下警告:

警告CA2213'DBConn'包含IDisposable类型的字段'DBConn.k__BackingField':'SqlConnection'.更改"DBConn"上的Dispose方法以在此字段上调用Dispose或Close.

但我的代码确实在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();            
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

D S*_*ley 17

您的代码没有问题. Dispose 在底层支持字段上调用.这是FxCop中的一个已知错误,它引入了C#6中引入的"getter-only"自动属性.现在,您可以使用类上的属性来抑制警告,或者只是忽略它,直到它被修复为止.的FxCop.


das*_*ick 15

原因是TheConn,因为它没有set访问器,所以是只读的.将属性声明更改为

public SqlConnection TheConn { get; private set; }
Run Code Online (Sandbox Code Playgroud)

解决了这个问题.