2014-11-22 65 views
4

這是我的代碼,它給了我CA2000的 「新的DataTable()...」 和 「新的DataColumn()......」 SC#CA2000處置對象之前失去範圍

usersDS.Tables.Add(new DataTable() 
{ 
    TableName = "Users", 
    Columns = { new DataColumn() { ColumnName = "Handle", DataType = typeof(string) }, new DataColumn() { ColumnName = "Nickname" ,DataType = typeof(string) } } 
}); 

是否有可能修復而不聲明變量?

+1

在這種情況下,代碼對我來說看起來很好,我只是簡單地禁止警告。 「DataTable」和「DataColumn」都不包含任何非託管資源。另見http://stackoverflow.com/questions/913228/should-i-dispose-dataset-and-datatable – hvd 2014-11-22 12:38:42

+2

相關:http://stackoverflow.com/questions/6684206/how-to-fix-a-ca2000- idisposable-c-sharp-compiler-warning-when-using-a-global-ca和http://stackoverflow.com/questions/4264986/to-dispose-or-not-to-dispose-ca2000 – 2014-11-22 12:39:04

+1

@JasonEvans它的基礎班級呢。 'DataTable'派生自'MarshalByValueComponent',並實現'IDisposable'。 'DataColumn'相同。 – hvd 2014-11-22 12:39:14

回答

6

這幾乎是How to fix a CA2000 IDisposable C# compiler warning, when using a global cache的重複。也許它應該被認爲是那個的重複。我不確定。

代碼分析是合法地抱怨說,該方法在理論上可能完成而不處理對象並且不安全地存儲在其他地方。如果在DataTable對象的初始化過程中發生異常,或者將DataTable對象添加到usersDS.Table對象(不管是什麼),則後者可能發生。

如果你可以保證這裏不會拋出任何異常,那麼恕我直言,它是完全正確的壓制CA警告。在這種情況下,你不僅僅知道CA,而且你很希望你知道你在做什麼。

如果您無法做出保證,那麼請不要在沒有引入本地變量的情況下修復警告,以便您能夠在發生異常時處置對象。例如:

DataTable dataTable = null; 
DataColumn dataColumn1 = null, dataColumn2 = null; 

try 
{ 
    dataColumn1 = new DataColumn() { ColumnName = "Handle", DataType = typeof(string) }; 
    dataColumn2 = new DataColumn() { ColumnName = "Nickname", DataType = typeof(string) }; 
    dataTable = new DataTable() 
    { 
     TableName = "Users", 
     Columns = { dataColumn1, dataColumn2 } 
    }; 
    usersDS.Tables.Add(dataTable); 
} 
catch 
{ 
    if (dataTable != null) 
    { 
     dataTable.Dispose(); 
    } 
    if (dataColumn1 != null) 
    { 
     dataColumn1.Dispose(); 
    } 
    if (dataColumn2 != null) 
    { 
     dataColumn2.Dispose(); 
    } 
    throw; 
} 
+0

「代碼分析合理地抱怨說,在理論上可以在沒有處理IDisposable對象的情況下完成該方法」 - 確實有可能,但對於Dispose()沒有的任何類沒有合理的投訴有意義的效果正如在評論中指出的那樣,即使'DataTable'和'DataColumn'實現了'IDisposable',那也沒有什麼實際用處,而且這些類應該被設計成不能實現'IDisposable'。我們無法解決這個問題。儘管我們可以避免對其Dispose()方法的無謂調用。 – hvd 2014-11-22 20:45:28

+2

「IDisposable」中'DataTable'和'DataColumn'沒有有意義的行爲的事實是_implementation detail_。即它不是'DataTable'或'DataColumn'的合約的一部分,並且在理論上可能會在未來發生變化。我傾向於對公共契約進行編碼,而不是私有實現和恕我直言,最好是繼續處理「IDisposable」對象,無論你瞭解他們的私有實現細節。因人而異。 – 2014-11-22 20:50:16

+0

一般來說這很合理,但在這種情況下,並不是那麼重要。不僅如此,你的答案建立在一個假設上,即一旦將數據表和列添加到數據集後就不會丟棄它,這可能是因爲處置數據集也會處理所包含的表和列,但是一個數據集不會這樣做,它的文檔不會聲稱這麼做。根據你自己的邏輯,你自己建議的方法是不正確的。 – hvd 2014-11-22 20:57:45

相關問題