首页 > 代码库 > C# 中的局部static变量

C# 中的局部static变量

  其实这问题没什么可讨论的,C#不支持局部静态变量。

  但还是想了一下C#为什么不支持局部静态变量,以下均是个人想法。

  C++和C支持局部静态变量,也就是在一个函数的内部声明一个静态变量,这种变量的特定如下:

  • 静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个程序的生命周期
  • 静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它
  • 生命变量的同时可以用初始化语句对静态变量进行赋值,该赋值语句只在函数第一次被调用时执行,即只执行一次
  • 如果没有初始化语句,则编译器采用该类型的默认值初始化变量

  但在C#中却无法声明这种存在于函数内部的静态变量,会出现编译错误,仔细想来,原因可能如下:

  C++和C均不是完全面向对象的编程语言,即有很多函数不属于任何类或类的实例,如果需要函数的某个变量具有“保留上一次函数调用时的值”的特性,有三种方法:

  • 声明全局变量
  • 声明全局静态变量
  • 声明局部静态变量

  全局变量和全局静态变量虽然可以实现某个变量“保留上一次函数调用时的值”的特性,但这两种变量的作用域较大,全局变量作用域为整个源程序,全局静态变量的作用域为变量声明所在的CPP文件,过大的变量作用域会造成安全隐患,因为该变量还可以被其他全局函数甚至类的成员函数调用,所以采用局部静态变量是最好的选择。既保证了变量具有“记忆”功能,有很好的限制了变量的作用域或者说可见性。

  与之相对,C#是完全面向对象的语言,任何变量或任何函数均应属于类或类的实例,这时C++中局部静态变量的功能可以由类的静态成员变量来实现,唯一不同的地方便是该变量的可见性的最小范围是类的内部(私有静态变量),而不是C++中局部静态变量的函数内部,稍微扩大了变量的作用域。

  但我认为这个缺憾是可以接受的,否则或破坏“类”这个概念的完备性,在面向对象的编程的语言中,类或类实例是最基本的组成单元,类的任何成员在类内部都应该是可见的,如果有局部静态变量这个概念存在,那么就好像你的家中有一部车,但是你却没有权利去开一样。

  借这个机会总结一下C#中static这个修饰符的应用,可以使用的场景:

  • 修饰类,即静态类,静态类隐式密封,且其成员必须全部显示声明为static
  • 修饰类成员:成员变量、成员方法等类内部的成员
  • 修饰readonly成员

  不可以使用的场景:

  • 方法或属性内部的局部变量,即不存在局部静态变量
  • 接口声明,即不存在静态接口
  • 接口成员成名,即接口内不存在静态成员
  • const成员,索然const成员具有static成员的特性,但是不可以显示使用static修饰符

C# 中的局部static变量