sonar software que para metricas medir kiuwan herramientas estatico estatica codigo checking analisis c# visual-studio visual-studio-2015 fxcop c#-6.0

c# - software - Advertencia de análisis de código CA2213-Descarte de llamada() en campo de respaldo IDisposable



software analisis de codigo (2)

Quería publicar esto, aunque lo descubrí mientras escribía la pregunta. Publicaremos respuesta a continuación.

Obteniendo la siguiente advertencia con VS Code Analysis:

Advertencia CA2213 ''DBConn'' contiene el campo ''DBConn.k__BackingField'' que es del tipo IDisposable: ''SqlConnection''. Cambie el método Dispose en ''DBConn'' para llamar a Dispose o Close en este campo.

Pero mi código llama a Dispose () en la propiedad DBConn. ¿No está en el campo de respaldo? Tengo otras instancias como esta, donde me deshago de dónde el compilador no emite esta advertencia. Este es el código a continuación:

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


No hay un problema con tu código Dispose se Dispose en el campo de respaldo subyacente. Este es un error conocido en FxCop que salió a la luz con la introducción de propiedades automáticas "solo de adquisición" que se introdujeron en C # 6. Por ahora, puede suprimir la advertencia con un atributo en la clase o simplemente ignorarla hasta que se solucione FxCop.


La razón es que TheConn , porque no tenía un acceso de set , era de solo lectura. Cambiar la declaración de propiedad a

public SqlConnection TheConn { get; private set; }

resuelve el problema. Lo extraño es que el compilador en realidad no arroja esto como un error; es decir, no debería poder llamar al método Dispose () fuera del constructor en absoluto si no se podía ejecutar.