C#中的局部static变量
其实这问题没什么可讨论的,C#不⽀持局部静态变量。
但还是想了⼀下C#为什么不⽀持局部静态变量,以下均是个⼈想法。
C++和C⽀持局部静态变量,也就是在⼀个函数的内部声明⼀个静态变量,这种变量的特定如下:
静态局部变量在函数内定义,但不象⾃动变量那样,当调⽤时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的⽣存期为整个程序的⽣命周期
静态局部变量的⽣存期虽然为整个源程序,但是其作⽤域仍与⾃动变量相同,即只能在定义该变量的函数内使⽤该变量。退出该函数后,尽管该变量还继续存在,但不能使⽤它
⽣命变量的同时可以⽤初始化语句对静态变量进⾏赋值,该赋值语句只在函数第⼀次被调⽤时执⾏,即只执⾏⼀次
如果没有初始化语句,则编译器采⽤该类型的默认值初始化变量
但在C#中却⽆法声明这种存在于函数内部的静态变量,会出现编译错误,仔细想来,原因可能如下:
C++和C均不是完全⾯向对象的编程语⾔,即有很多函数不属于任何类或类的实例,如果需要函数的某个变量具有“保留上⼀次函数调⽤时的值”的特性,有三种⽅法:
声明全局变量
声明全局静态变量
声明局部静态变量
全局变量和全局静态变量虽然可以实现某个变量“保留上⼀次函数调⽤时的值”的特性,但这两种变量的作⽤域较⼤,全局变量作⽤域为整个源程序,全局静态变量的作⽤域为变量声明所在的CPP⽂件,过⼤的变量作⽤域会造成安全隐患,因为该变量还可以被其他全局函数甚⾄类的成员函数调⽤,所以采⽤局部静态变量是最好的选择。既保证了变量具有“记忆”功能,有很好的限制了变量的作⽤域或者说可见性。
与之相对,C#是完全⾯向对象的语⾔,任何变量或任何函数均应属于类或类的实例,这时C++中局部静态变量的功能可以由类的静态成员变量来实现,唯⼀不同的地⽅便是该变量的可见性的最⼩范围是类的内部(私有静态变量),⽽不是C++中局部静态变量的函数内部,稍微扩⼤了变量的作⽤域。
但我认为这个缺憾是可以接受的,否则或破坏“类”这个概念的完备性,在⾯向对象的编程的语⾔中,
类或类实例是最基本的组成单元,类的任何成员在类内部都应该是可见的,如果有局部静态变量这个概念存在,那么就好像你的家中有⼀部车,但是你却没有权利去开⼀样。
借这个机会总结⼀下C#中static这个修饰符的应⽤,可以使⽤的场景:
修饰类,即静态类,静态类隐式密封,且其成员必须全部显⽰声明为static
修饰类成员:成员变量、成员⽅法等类内部的成员
修饰readonly成员
不可以使⽤的场景:
⽅法或属性内部的局部变量,即不存在局部静态变量
接⼝声明,即不存在静态接⼝
接⼝成员成名,即接⼝内不存在静态成员static修饰的变量
const成员,索然const成员具有static成员的特性,但是不可以显⽰使⽤static修饰符
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论