2012-06-21 125 views
2

請考慮下面的代碼:變量在靜態類中的靜態方法

1)public static class MyClass 
2){ 
3) public static DateTime MyMethod(DateTime dt) 
4) { 
5)   DateTime temp = new DateTime(); 
6)   temp = dt.AddDays(1); 
7)   return temp; 
8) } 
9)} 

是否temp變量例如每到MyMethod任何電話?或者因爲它是靜態類中的一個靜態方法,只有一個temp變量在內存中分配的實例?

感謝

回答

7

temp既不是靜態的,也不是一個實例變量,它是一個本地變量。聲明它的方法是否爲靜態無關緊要:變量的作用域從其聲明的開始處開始,並在聲明範圍的結束大括號}處結束。通過MyMethod的每個正在執行的線程都獲取自己的temp副本,該變量在變量範圍之外的任何地方都是不可見的。

+0

感謝親愛的朋友。你的意思是,如果我把'SqlConnection'放在那個方法裏面,打開並關閉它,那個連接會在每個線程中打開和關閉,並且每個線程都不會影響其他線程的連接? – Arian

+0

@Kerezo是的,這是絕對正確的:每個正在執行的線程都會得到自己的變量,無論有多少個線程同時執行。 – dasblinkenlight

4

每次調用MyMethod時,temp變量是否都有實例?

如果您的意思是「每次撥打電話MyMethod都得到單獨的temp變量嗎?」那麼答案是肯定的。

事實上,它是一個靜態類中的靜態方法是無關緊要的 - 它是一個局部變量,所以每次調用時都會得到一個「新」局部變量。

+0

你說過這樣的事實,它是一個靜態類中的靜態方法是無關緊要的,但在擴展方法中,我們這樣做 – Arian

+2

@Kerezo:「我們這樣做」是什麼意思?即使在擴展方法中,局部變量仍然是局部變量...... –

0

temp每次調用一個實例。

順便說一句我缺少在靜態方法中定義靜態局部變量的可能性,就像在C++中一樣。

0

即使在靜態方法中,臨時變量也必須聲明爲靜態,否則它只是在該實例中本地創建,然後在方法調用結束時吹掉。