2016-01-04 9 views
10

Desidero postare questo, anche se l'ho capito mentre stavo scrivendo la domanda. Pubblicheremo la risposta qui sotto.Analisi codice Avviso CA2213 - Chiamata Dispose() su campo di supporto IDisposable

Ottenere il seguente avviso con VS analisi del codice:

Attenzione CA2213 'dbconn' contiene campo 'DBConn.k__BackingField' che è di tipo IDisposable: 'SqlConnection'. Cambia il metodo Dispose in "DBConn" per chiamare Dispose o Close in questo campo.

Ma il mio codice fa chiamare Dispose() sulla proprietà dbconn. Non è sul campo di supporto? Ho altre istanze come questa - dove sono disposto dove il compilatore non lancia questo avvertimento. Questo è il codice qui sotto:

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

Quale versione di C# stai usando? Avresti un avvertimento _different_ del compilatore prima di C# 6 poiché devi fornire un setter per le proprietà automatiche. –

+2

Questo è un [bug noto] (https://connect.microsoft.com/VisualStudio/feedback/details/1798055/code-analysis-rule-ca2213-disposablefieldsshouldbedisposed-doesnt-understand-read-only-auto-properties-being -disposed) in FxCop che verrà corretto in una versione futura. –

risposta

9

Non c'è un problema con il tuo codice. Disposesarà essere chiamato sul campo di supporto sottostante. Questo è un known bug in FxCop che è emerso con l'introduzione delle proprietà automatiche "solo getter" che sono state introdotte in C# 6. Per ora, puoi o suppress the warning con un attributo sulla classe o semplicemente ignorarlo finché non viene corretto in FxCop.

10

La ragione è che TheConn, perché non hanno una funzione di accesso set, è stato di sola lettura. Modifica della dichiarazione di proprietà su

public SqlConnection TheConn { get; private set; } 

risolto il problema. La cosa strana è che il compilatore in realtà non lo lancia come un errore; Ad esempio, non dovrei essere in grado di chiamare il metodo Dispose() al di fuori del costruttore, se non fosse in grado di eseguire.

+0

"Non dovrei essere in grado di chiamare il metodo Dispose() al di fuori del costruttore" cosa intendi con questo? –

+0

@DStanley: Voglio dire - quando 'TheConn' era di sola lettura, perché il compilatore mi permetteva di chiamare' TheConn.Dispose() 'dal metodo' Dispose() 'se non era effettivamente in grado di smaltire l'oggetto? – dashnick

+0

Poiché _reference_ è di sola lettura, non l'istanza. È possibile chiamare metodi (come 'Dispose') e modificare le proprietà sull'oggetto ma non è possibile modificare l'istanza a cui punta la proprietà. –

Problemi correlati