其實這問題沒什么可討論的,C#不支持局部靜態變量。
但還是想了一下C#為什么不支持局部靜態變量,以下均是個人想法。
C++和C支持局部靜態變量,也就是在一個函數的內部聲明一個靜態變量,這種變量的特定如下:
- 靜態局部變量在函數內定義,但不象自動變量那樣,當調用時就存在,退出函數時就消失。靜態局部變量始終存在着,也就是說它的生存期為整個程序的生命周期
- 靜態局部變量的生存期雖然為整個源程序,但是其作用域仍與自動變量相同,即只能在定義該變量的函數內使用該變量。退出該函數后,盡管該變量還繼續存在,但不能使用它
- 生命變量的同時可以用初始化語句對靜態變量進行賦值,該賦值語句只在函數第一次被調用時執行,即只執行一次
- 如果沒有初始化語句,則編譯器采用該類型的默認值初始化變量
但在C#中卻無法聲明這種存在於函數內部的靜態變量,會出現編譯錯誤,仔細想來,原因可能如下:
C++和C均不是完全面向對象的編程語言,即有很多函數不屬於任何類或類的實例,如果需要函數的某個變量具有“保留上一次函數調用時的值”的特性,有三種方法:
- 聲明全局變量
- 聲明全局靜態變量
- 聲明局部靜態變量
全局變量和全局靜態變量雖然可以實現某個變量“保留上一次函數調用時的值”的特性,但這兩種變量的作用域較大,全局變量作用域為整個源程序,全局靜態變量的作用域為變量聲明所在的CPP文件,過大的變量作用域會造成安全隱患,因為該變量還可以被其他全局函數甚至類的成員函數調用,所以采用局部靜態變量是最好的選擇。既保證了變量具有“記憶”功能,有很好的限制了變量的作用域或者說可見性。
與之相對,C#是完全面向對象的語言,任何變量或任何函數均應屬於類或類的實例,這時C++中局部靜態變量的功能可以由類的靜態成員變量來實現,唯一不同的地方便是該變量的可見性的最小范圍是類的內部(私有靜態變量),而不是C++中局部靜態變量的函數內部,稍微擴大了變量的作用域。
但我認為這個缺憾是可以接受的,否則或破壞“類”這個概念的完備性,在面向對象的編程的語言中,類或類實例是最基本的組成單元,類的任何成員在類內部都應該是可見的,如果有局部靜態變量這個概念存在,那么就好像你的家中有一部車,但是你卻沒有權利去開一樣。
借這個機會總結一下C#中static這個修飾符的應用,可以使用的場景:
- 修飾類,即靜態類,靜態類隱式密封,且其成員必須全部顯示聲明為static
- 修飾類成員:成員變量、成員方法等類內部的成員
- 修飾readonly成員
不可以使用的場景:
- 方法或屬性內部的局部變量,即不存在局部靜態變量
- 接口聲明,即不存在靜態接口
- 接口成員成名,即接口內不存在靜態成員
- const成員,索然const成員具有static成員的特性,但是不可以顯示使用static修飾符
