2016-01-04 19 views
10

Bunu yazarken, soruyu yazarken anladım. Aşağıda cevap yazacak.Kod Analizi Uyarı CA2213 - Call Dispose() IDisposable destek alanında

aşağıdaki VS Kod Analizi ile uyarı alma: 'SqlConnection': CA2213 'DBConn' ıdisposable tiptedir alanını 'DBConn.k__BackingField' içeriyor Uyarı

. Bu alana At'ı veya Kapat'ı çağırmak için 'DBConn' üzerindeki Atma yöntemini değiştirin.

Ama benim kod DBConn mülkiyet çağrı Dispose() yapar. Arka alanda değil mi? Bunun gibi başka örneklere sahibim - derleyicinin bu uyarıyı atmadığı yerde imha ediyorum. Bir set erişimci, oldu salt okunur olmadığı için,

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

Hangi C# sürümünü kullanıyorsunuz? Otomatik özellikler için bir ayarlayıcı sağlamanız gerektiğinden C# 6'dan önce bir _different_ derleyici uyarısı alırsınız. –

+2

Bu, [bilinen bir hata] (https://connect.microsoft.com/VisualStudio/feedback/details/1798055/code-analysis-rule-ca2213-disposablefueshouldbedis-doesnt-understand-read-only-auto-properties-being FxCop içinde gelecekteki sürümde sabitlenecektir. –

cevap

9

Kodunuzda sorun yok. Alttaki arka alan üzerinde olacaktır. Bu, C# 6'da tanıtılan "yalnızca alıcı" otomatik özelliklerin tanıtımıyla kaplanmış olan FxCop içinde bir known bug. Sınıf için bir öznitelikle suppress the warning veya FxCop içinde sabitleninceye kadar görmezden gelebilirsiniz.

10

nedeni TheConn geçerli: Bu, aşağıdaki kodudur. Özellik bildiriminin,

sorunu çözmesi sorunu çözmüştür. Tuhaf olan şey, derleyicinin bunu bir hata olarak atmaması; Yani, çalıştırılamıyorsa, yapıcının dışındaki Dispose() yöntemini çağırmamalıydım.

+0

"Yapıcı dışındaki Dispose() yöntemini hiç çağırmamalıyım" derken ne demek istiyorsun? –

+0

@DStanley: Yani - TheConn'un salt okunur olduğu zaman, derleyici neden olmasa bile, derleyici 'Dispose()' yönteminden TheConn.Dispose() 'i çağırmamı sağladı? nesneyi atın? – dashnick

+0

_reference_ salt okunur olduğu için, örnek değil. Yöntemleri ("Dispose" gibi) çağırabilir ve nesne üzerindeki özellikleri değiştirebilir, ancak özelliğin işaret ettiği örneği değiştiremezsiniz. –

İlgili konular