Предупреждение анализа кода CA2213 - вызов Dispose() в поле поддержки IDisposable
Хотел опубликовать это, хотя я понял это, когда писал вопрос. Выложу ответ ниже.
Получение следующего предупреждения с VS Code Analysis:
Предупреждение CA2213 "DBConn" содержит поле "DBConn.k__BackingField" типа IDisposable: "SqlConnection". Измените метод Dispose для DBConn, чтобы он вызывал Dispose или Close для этого поля.
Но мой код вызывает Dispose() для свойства DBConn. Разве это не на поле поддержки? У меня есть другие случаи, подобные этому - где я располагаю, где компилятор не выдает это предупреждение. Это код ниже:
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();
}
}
}
2 ответа
Там нет проблемы с вашим кодом. Dispose
будет вызван на базовое поле поддержки. Это известная ошибка в FxCop, которая появилась с введением автоматических свойств "только для получения", которые были представлены в C# 6. На данный момент вы можете либо подавить предупреждение с помощью атрибута класса, либо просто игнорировать его, пока оно не будет исправлено в FxCop.
Причина в том, что TheConn
потому что у него не было set
accessor, был только для чтения. Изменение объявления свойства на
public SqlConnection TheConn { get; private set; }
решил проблему.