【C#】全域性變數、全域性靜態變數、區域性變數、區域性靜態變數的區別
C#中變數分為:全域性變數、靜態全域性變數、區域性變數和靜態區域性變數。
1、按儲存區域分
(1)全域性變數、靜態全域性變數和靜態區域性變數都存放在記憶體的靜態儲存區域;
(2)區域性變數存放在記憶體的棧區。
2、按作用域分 (1)全域性變數在整個工程檔案內都有效; (2)靜態全域性變數只在定義它的檔案內有效; (3)靜態區域性變數只在定義它的函式內有效,並且程式僅分配一次記憶體,函式返回後,該變數不會消失; (4)區域性變數在定義它的函式內有效,但是函式返回後失效。
以上是對於他們巨集觀上的區分,接下來具體的區分他們之間的關係:
1、全域性變數和靜態全域性變數的區別——作用域
這兩者的區別在於非靜態全域性變數的作用域是整個源程式,當一個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於一個原始檔內,只能為該原始檔內的函式公用, 因此可以避免在其它原始檔中引起錯誤。可以說靜態全域性變數比全域性變數的限制更大一點。
2、區域性變數和靜態區域性變數的區別——生存期
靜態區域性變數只在它定義的函式內有效,並且程式僅分配一次記憶體,函式返回後,該變數不會消失。雖然離開定義它的函式後不能使用,但如再次呼叫該函式,靜態區域性變數還可以繼續使用,而且儲存了前次呼叫後保留下來的值。 區域性變數也僅僅在它定義的函式內部有效,但是呼叫函式結束後,返回時失效。
3、靜態區域性變數和全域性變數的區別
上面對於靜態區域性變數已經介紹過了,它的作用域定義在函式內,離開了函式就不能用了。而全域性變數定義後所有的函式都可以使用。前者是隻能用於一個函式,而後者卻可以應用於所有的函式。