2013-04-03 49 views
0

確定這裏存在是我的代碼錯誤::不在目前情況下

 DataTable myDataTable = new DataTable(); 
     try 
     { 
      // Code Logic 
     } 
     catch (Exception exp) 
     { 
      //Handle Exception 
     } 
     finally 
     { 
      myDataTable.Dispose(); 
     } 

它看起來很好,並沒有顯示出編譯錯誤

但是,當我宣佈試藥水內的數據表就顯示錯誤

The name 'myDataTable' does not exist in the current context  

下面是代碼

 try 
     { 
      DataTable myDataTable = new DataTable(); 
     } 
     catch (Exception exp) 
     { 
      //Handle Exception 
     } 
     finally 
     { 
      myDataTable.Dispose(); 
     } 

爲什麼如此?

+0

劃定範圍後,將處理數據表。它在'try'塊中聲明,所以它只存在於那裏。 – yoozer8

+0

那麼如何處理這些元素? – iJade

回答

2

在聲明塊中的數據表是局部的塊。您需要在塊外聲明它以在塊外訪問它。

或者,你可以使用using該塊被執行

using(DataTable myDataTable = new DataTable()) 
{ 
    try 
    { ... } 
    catch (Exception exp) 
    { 
      //Handle Exception 
    } 
} 
-- data table is disposed after this 
0

當位於try塊內時,它將在「內部」範圍內進行聲明。如果你想操縱它,或者做任何事情,它必須在try之外。

以類似的方式,如果您在if子句中聲明變量。它在該塊的範圍內。

0

這是因爲你在不同的範圍內使用它。您的DataTable裏面的try區塊,因此使其無法訪問裏面的finally區塊。

0

在第二種情況下,您將myDataTable的範圍限制爲只有try塊部分。

你能解決這個問題是這樣的:

DataTable myDataTable; 
    try 
    { 
     myDataTable = new DataTable(); 
    } 
    catch (Exception exp) 
    { 
     //Handle Exception 
    } 
    finally 
    { 
     myDataTable.Dispose(); 
    } 
+0

一般來說,當DataTable的構造函數拋出任何異常時,finally塊可能會拋出NullReferenceException異常。在像這樣的結構中,你應該在finally塊中檢查myDataTable爲null。 –

+0

@DavidGregor一般來說你是對的,但是這個具體的問題是「爲什麼這麼做?」,這意味着關於變量作用域的基本討論,而不是所有使用可變連接符的空... – Lanorkin

+0

我完全同意。無論如何,當你在這裏張貼一段可以自由使用的代碼時,我希望不會有任何可能的第一眼看到的「bug」 –

相關問題