C# 中的局部static變量


  其實這問題沒什么可討論的,C#不支持局部靜態變量。

  但還是想了一下C#為什么不支持局部靜態變量,以下均是個人想法。

  C++和C支持局部靜態變量,也就是在一個函數的內部聲明一個靜態變量,這種變量的特定如下:

  • 靜態局部變量在函數內定義,但不象自動變量那樣,當調用時就存在,退出函數時就消失。靜態局部變量始終存在着,也就是說它的生存期為整個程序的生命周期
  • 靜態局部變量的生存期雖然為整個源程序,但是其作用域仍與自動變量相同,即只能在定義該變量的函數內使用該變量。退出該函數后,盡管該變量還繼續存在,但不能使用它
  • 生命變量的同時可以用初始化語句對靜態變量進行賦值,該賦值語句只在函數第一次被調用時執行,即只執行一次
  • 如果沒有初始化語句,則編譯器采用該類型的默認值初始化變量

  但在C#中卻無法聲明這種存在於函數內部的靜態變量,會出現編譯錯誤,仔細想來,原因可能如下:

  C++和C均不是完全面向對象的編程語言,即有很多函數不屬於任何類或類的實例,如果需要函數的某個變量具有“保留上一次函數調用時的值”的特性,有三種方法:

  • 聲明全局變量
  • 聲明全局靜態變量
  • 聲明局部靜態變量

  全局變量和全局靜態變量雖然可以實現某個變量“保留上一次函數調用時的值”的特性,但這兩種變量的作用域較大,全局變量作用域為整個源程序,全局靜態變量的作用域為變量聲明所在的CPP文件,過大的變量作用域會造成安全隱患,因為該變量還可以被其他全局函數甚至類的成員函數調用,所以采用局部靜態變量是最好的選擇。既保證了變量具有“記憶”功能,有很好的限制了變量的作用域或者說可見性。

  與之相對,C#是完全面向對象的語言,任何變量或任何函數均應屬於類或類的實例,這時C++中局部靜態變量的功能可以由類的靜態成員變量來實現,唯一不同的地方便是該變量的可見性的最小范圍是類的內部(私有靜態變量),而不是C++中局部靜態變量的函數內部,稍微擴大了變量的作用域。

  但我認為這個缺憾是可以接受的,否則或破壞“類”這個概念的完備性,在面向對象的編程的語言中,類或類實例是最基本的組成單元,類的任何成員在類內部都應該是可見的,如果有局部靜態變量這個概念存在,那么就好像你的家中有一部車,但是你卻沒有權利去開一樣。

  借這個機會總結一下C#中static這個修飾符的應用,可以使用的場景:

  • 修飾類,即靜態類,靜態類隱式密封,且其成員必須全部顯示聲明為static
  • 修飾類成員:成員變量、成員方法等類內部的成員
  • 修飾readonly成員

  不可以使用的場景:

  • 方法或屬性內部的局部變量,即不存在局部靜態變量
  • 接口聲明,即不存在靜態接口
  • 接口成員成名,即接口內不存在靜態成員
  • const成員,索然const成員具有static成員的特性,但是不可以顯示使用static修飾符


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM