C# 中的局部static变量
其实这问题没什么可讨论的,C#不支持局部静态变量。
但还是想了一下C#为什么不支持局部静态变量,以下均是个人想法。
C++和C支持局部静态变量,也就是在一个函数的内部声明一个静态变量,这种变量的特定如下:
- 静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个程序的生命周期
- 静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它
- 生命变量的同时可以用初始化语句对静态变量进行赋值,该赋值语句只在函数第一次被调用时执行,即只执行一次
- 如果没有初始化语句,则编译器采用该类型的默认值初始化变量
但在C#中却无法声明这种存在于函数内部的静态变量,会出现编译错误,仔细想来,原因可能如下:
C++和C均不是完全面向对象的编程语言,即有很多函数不属于任何类或类的实例,如果需要函数的某个变量具有“保留上一次函数调用时的值”的特性,有三种方法:
- 声明全局变量
- 声明全局静态变量
- 声明局部静态变量
全局变量和全局静态变量虽然可以实现某个变量“保留上一次函数调用时的值”的特性,但这两种变量的作用域较大,全局变量作用域为整个源程序,全局静态变量的作用域为变量声明所在的CPP文件,过大的变量作用域会造成安全隐患,因为该变量还可以被其他全局函数甚至类的成员函数调用,所以采用局部静态变量是最好的选择。既保证了变量具有“记忆”功能,有很好的限制了变量的作用域或者说可见性。
与之相对,C#是完全面向对象的语言,任何变量或任何函数均应属于类或类的实例,这时C++中局部静态变量的功能可以由类的静态成员变量来实现,唯一不同的地方便是该变量的可见性的最小范围是类的内部(私有静态变量),而不是C++中局部静态变量的函数内部,稍微扩大了变量的作用域。
但我认为这个缺憾是可以接受的,否则或破坏“类”这个概念的完备性,在面向对象的编程的语言中,类或类实例是最基本的组成单元,类的任何成员在类内部都应该是可见的,如果有局部静态变量这个概念存在,那么就好像你的家中有一部车,但是你却没有权利去开一样。
借这个机会总结一下C#中static这个修饰符的应用,可以使用的场景:
- 修饰类,即静态类,静态类隐式密封,且其成员必须全部显示声明为static
- 修饰类成员:成员变量、成员方法等类内部的成员
- 修饰readonly成员
不可以使用的场景:
- 方法或属性内部的局部变量,即不存在局部静态变量
- 接口声明,即不存在静态接口
- 接口成员成名,即接口内不存在静态成员
- const成员,索然const成员具有static成员的特性,但是不可以显示使用static修饰符
C# 中的局部static变量的更多相关文章
- C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别
局部变量(Local variables)与 全局变量: 在子程序或代码块中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序 ...
- 转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性
原文地址:Java中子类是否可以继承父类的static变量和方法而呈现多态特性 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明 ...
- Java中子类是否可以继承父类的static变量和方法而呈现多态特性
静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明为static的方法有以下几条限制: 它们仅能调用其他的static 方法. 它 ...
- static变量的使用
静态变量 类型说明符是static. 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间 ...
- static变量 方法 类 和final
static变量:声明为static的变量实质上就是全局变量.当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量.静态变量与静态方法类似.所有此类实例共 ...
- 转载 IOS开发之---static变量
Objective-C 支持全局变量 主要有两种实现方式: (1)第一种和C/C++中的一样, 使用"extern"关键词: (2)另外一种就是使用单例实现. (比如我们经常会把一 ...
- 局部变量和static变量的区别
static int a ; int b; scanf_s("%d %d",&a,&b); 01374212 lea eax,[b] 01374215 push e ...
- iOS中 static变量与全局、局部变量的区别 !
static变量与全局.局部变量的区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式. 这两者在存储方式上并 ...
- Asp.net中static变量和viewstate的使用方法(谨慎)
在.Net平台下进行CS软件开发时,我们经常遇到以后还要用到某些变量上次修改后的值,为了简单起见,很多人都习惯用static来定义这些变量,我也是.这样非常方便,下一次调用某个函数时该变量仍然保存的是 ...
随机推荐
- unity3D中重要函数
Update 当MonoBehaviour启用时,其Update在每一帧被调用. LateUpdate 当Behaviour启用时,其 LateUpdate在每一帧被调用. FixedUpdate 当 ...
- 安装aptana(1)
以前在myeclipse8.5上装了aptana,现在用myeclipse2014了,但是用原来的方法没有安装上,网上搜了下,发现都是老的方法,对新版的myeclipse已经不适用了,下面是转载的一篇 ...
- hibernate异常:org.hibernate.MappingException
这个是映射文件配置错误 异常:org.hibernate.MappingException 提示:Could not determine type for: java.lang,String, at ...
- mvn 如何添加本地jar包 IDEA pom.xm
-------------背景介绍------------------------------------ 最近做的项目,就是office在线浏览功能, 使用的是openoffice+jodconve ...
- 笔记整理--C语言
linux下错误的捕获:errno和strerror的使用 - Google Chrome (2014/2/26 17:31:39) linux下错误的捕获:errno和strerror的使用 201 ...
- RPC学习
之前有一篇文章,说了RPC的内容: http://www.cnblogs.com/charlesblc/p/6214391.html 如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对 ...
- 第七十六节,css颜色和透明度,盒子阴影和轮廓,光标样式
css颜色和透明度,盒子阴影和轮廓,光标样式 学习要点: 1.颜色和透明度 2.盒子阴影和轮廓 3.光标样式 一.颜色和透明度 颜色我们之前其实已经用的很多了,比如字体颜色.背景颜色.边框颜色.但除了 ...
- iOS开发关于xcode中souceControl的苹果文档翻译(节选)
Subversion 1.7 provides many benefits: svn1.7版本有以下好处: Improved performance. Increased speed for many ...
- windows网络编程(1)同步套接字
1.socket是应用程序与网络驱动程序的桥梁,在应用程序中创建socket,将数据交付给socket即完成数据传输,剩下的任务由socket和网络驱动程序完成: 2.套接字类型:SOCK_STREA ...
- HDU_1245_Saving James Bond_最短路
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1245 题意:给一个已知直径的圆形岛,然后岛的附近是湖,湖里有一些点,以坐标的形式给出,最外层是矩形的终 ...