Предупреждение анализа кода 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; }

решил проблему.

Другие вопросы по тегам