2014-12-13 41 views
0

我有一個OleDbCommand變量,我想用它來創建一個命令生成器,如果它是空的,使用我的數據適配器。如果該變量不爲null,則該變量中已經創建了一個命令生成器。如果我使用局部變量並測試爲null,它會抱怨說:「使用未分配的局部變量...」如果我使變量public/global,則一切正常。相關的代碼是:測試oledbcommandbuilder變量爲空

//Created locally in a button procedure: 
OleDbCommandBuilder cBuilder; 

if (cBuilder == null) 
{ 
    cBuilder = new OleDbCommandBuilder(dAdapter); 
} 

如果我在本地註釋掉聲明,把它定義爲大衆UP與其他公共變量,那麼它沒有任何牢騷工作正常。相對於我正在做的事情,爲什麼它的範圍在本地或公開會有什麼不同?我只是想測試一下,看看這個命令生成器是否已經創建好了,所以我不會一遍又一遍地創建多個命令。我用我的dataadapter變量做同樣的事情,但在這種情況下,它必須公開。那麼是否還有更好的方法來攻擊這個測試,以便在嘗試創建它之前測試是否已經創建了一些東西?

回答

1

相對於我在做什麼,爲什麼它的範圍是本地或公共有什麼區別?

不同的是,局部變量必須在包含它們的方法開始沒有價值。不管該方法運行了多少次,它的變量每次執行時都不會有值。

在您的例子:

OleDbCommandBuilder cBuilder; 

if (cBuilder == null) 
{ 
    cBuilder = new OleDbCommandBuilder(dAdapter); 
} 

此空檢查是沒有意義的,因爲cBuilder有在這一點上沒有任何價值,因此沒有理由去檢查它是否null

C#編譯器會阻止在爲其分配值之前訪問本地變量。這是幫助清除錯誤的保障。

如果您正在使用一個分支比較複雜且相對複雜的方法,並且變得太複雜以至於無法確保每個步驟中的變量都具有值,則可以將其初始化爲null(或其他值)聲明:

OleDbCommandBuilder cBuilder = null; 

我明確指出,除非有令人信服的理由,否則不要這樣做。編譯器對訪問未初始化變量的限制是有原因的,上面通常只是一種懶惰的方式來規避它們。

+0

どうも有難うJL ....我陷入了處置的概念,並擔心每次調用這段代碼時都會創建重複的對象,在這種情況下是OleDbCommandBuilder。因此,如果局部變量每次都以無值開始,那麼我是否正確地假設它們表示的對象是自動放置的?如果是這樣,這很好,因爲它簡化了事情。 – valhalla 2014-12-13 19:25:09

+0

它們不一定會自動處理。您應該使用[使用](http://msdn.microsoft.com/en-us/library/yh598w02.aspx)塊,以確保每次完成使用時都處理它們。 – JLRishe 2014-12-13 19:32:18