代码分析警告CA2213-对IDisposable后台字段调用Dispose()

本文关键字:调用 字段 Dispose 后台 IDisposable 警告 CA2213- 代码 | 更新日期: 2023-09-27 18:28:46

我想发布这个,尽管我在写问题时就想出来了。将在下面发布答案。

使用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();            
        }
    }
}

代码分析警告CA2213-对IDisposable后台字段调用Dispose()

您的代码没有问题。Dispose将在底层后台字段上调用。这是FxCop中的一个已知错误,随着C#6中引入的"仅getter"自动属性的引入而浮出水面。目前,您可以使用类上的属性来抑制警告,也可以忽略它,直到在FxCop中修复为止。

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

public SqlConnection TheConn { get; private set; }

解决了问题。