2011-12-15 109 views
2

當一個網站同時擊中具有非靜態變量的相同靜態方法時,即使未聲明爲靜態,這些變量是否是靜態的?我會這樣認爲的,但我不得不問。靜態新手:靜態類/方法中的非靜態變量是否意味着靜態?

另一種選擇是相同的代碼,不同的執行有不同的內部變量,所以這段代碼不會產生例如有意想不到的字符串長度:

public static class MyClass 
{ 
    public static int getResult(string ext) 
    { 
     int length = est.length; // One place in RAM or multiple? 
     Thread.Sleep(5000);  // Does this stop program execution for others? 
     return length; 
    } 
} 

問題總結:

  1. 是沒有聲明的靜態方法變量靜態隱含靜態,即同時執行靜態代碼會相互影響嗎?
  2. 或者做這些變量都有各自的存儲空間嗎?
  3. 和Thread.Sleep(5000)在一個靜態方法中停止所有用戶的執行?

回答

5

您在展示本地變量。所以不,這些不是靜態變量。每次調用方法(包括如果它遞歸地調用自己),你會得到一組新的變量。不同的線程將而不是共享這些變量。請注意,這與該類是靜態類無關。你需要區分:

  • 局部變量,這屬於該聲明它們
  • 實例變量的方法,與聲明類型
  • 靜態變量,與聲明類型本身相關聯的特定實例相關聯(而不是與任何特定實例)

Thread.Sleep不僅使當前線程睡眠 - 如果你的應用程序有多個線程,別人仍然會能夠執行。

+0

TYVM。我使用LinqPad創建了一個例子來證明它。我有三個線程計數,倒計時,不計算,只報告變量內容。像你所描述的那樣工作。 – 2011-12-15 23:28:11