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来定义这些变量,我也是.这样非常方便,下一次调用某个函数时该变量仍然保存的是 ...
随机推荐
- FD.io vpp 框架转发图
在ip4-icmp-input 与 ip4-udp-input后可以注册后续的处理函数,ip4-icmp-input根据 icmp的报文类型选择相应的处理函数,而ip4-udp-input根据端口选择 ...
- Drupal设置首页默认内容
接触Drupal时间不长,记录一下学习点滴~ Drupal首页的内容,默认是取node表的内容展示的,如果想让首页展示自己创表的内容怎么办呢?以Drupal7为例 在这个admin/config/sy ...
- 不使用jquery情况下循环添加绑定事件方法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- gulp学习笔记(一)
gulp 是基于 Nodejs 的自动任务运行器,能自动化地完成javascript/coffee/sass/less/html/image/css等文件的的测试.检查.合并.压缩.格式化.浏览器自动 ...
- 查看源码利器之sublime text 3 配置 Ctags 插件
最近在看源码的时候发现sublime text 3是很给力的一款软件,小巧精致,这里着重讲解一下Ctags协助编译和跟踪函数 一.安装Package Control (如果Preferences &g ...
- Zend Studio 无法打开的解决办法
今天郁闷的...正在写代码,突然 computer 嗝屁了,断电后自动重启了一次,开机后就悲剧了,Zend Studio 9 无法打开了,每次运行只弹窗个 请查看项目错误日志的提示 然后就没反应了.. ...
- noip2013Day2T3-华容道【一个蒟蒻的详细题解】
描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的 ...
- Spring 创建 IOC 容器 ClassPathXmlApplicationContext 类
一.ClassPathXmlApplicationContext 类的作用 在 Java 环境中使用 Spring 时,需要用 new ClassPathXmlApplicationContext(c ...
- cookie模拟
1 为什么要使用cookie模拟 从日常项目测试过程中的问题说起. 比如要进行论坛中的文件下载功能的测试.我们都知道只有登录用户才能进行下载操作,这样我们的测试过程可能 ...
- python并行任务之生产消费模式
一. 生产者/消费者模式 概念:生产者产生一块数据,放到buffer中,与此同时,消费者在从buffer中取出并消耗这些数据 理解:像生活中厂家生产出产品,顾客购买消耗这些产品,buffer就是存放商 ...