代码分析警告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();
}
}
}
您的代码没有问题。Dispose
将在底层后台字段上调用。这是FxCop中的一个已知错误,随着C#6中引入的"仅getter"自动属性的引入而浮出水面。目前,您可以使用类上的属性来抑制警告,也可以忽略它,直到在FxCop中修复为止。
原因是TheConn
是只读的,因为它没有set
访问器。将属性声明更改为
public SqlConnection TheConn { get; private set; }
解决了问题。