Подтвердить что ты не робот

Предупреждение анализа кода CA2213 - Вызов Dispose() в поле IDisposable backing

Хотел опубликовать это, хотя я понял это, когда писал вопрос. Будет опубликован ответ ниже.

Получение следующего предупреждения с помощью анализа кода VS:

Предупреждение 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();            
        }
    }
}
4b9b3361

Ответ 1

У вас нет проблем с вашим кодом. Dispose будет вызываться в базовом поле поддержки. Это известная ошибка в FxCop, которая появилась с появлением автоматических свойств "только для геттера", которые были введены на С# 6. На данный момент вы может подавить предупреждение с атрибутом класса или просто игнорировать его до тех пор, пока он не будет исправлен в FxCop.

Ответ 2

Причина в том, что TheConn, поскольку он не имел аксессуар set, был доступен только для чтения. Изменение объявления свойства на

public SqlConnection TheConn { get; private set; }

решил проблему. Странно то, что компилятор фактически не бросает это как ошибку; то есть я не должен был бы вызывать метод Dispose() вне конструктора вообще, если он не смог выполнить.