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

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

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

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

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

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

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

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

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

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

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

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

  不可以使用的场景:

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

C# 中的局部static变量的更多相关文章

  1. C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别

    局部变量(Local variables)与 全局变量: 在子程序或代码块中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序 ...

  2. 转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性

    原文地址:Java中子类是否可以继承父类的static变量和方法而呈现多态特性 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明 ...

  3. Java中子类是否可以继承父类的static变量和方法而呈现多态特性

    静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明为static的方法有以下几条限制: 它们仅能调用其他的static 方法. 它 ...

  4. static变量的使用

    静态变量 类型说明符是static. 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间 ...

  5. static变量 方法 类 和final

    static变量:声明为static的变量实质上就是全局变量.当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量.静态变量与静态方法类似.所有此类实例共 ...

  6. 转载 IOS开发之---static变量

    Objective-C 支持全局变量 主要有两种实现方式: (1)第一种和C/C++中的一样, 使用"extern"关键词: (2)另外一种就是使用单例实现. (比如我们经常会把一 ...

  7. 局部变量和static变量的区别

    static int a ; int b; scanf_s("%d %d",&a,&b); 01374212 lea eax,[b] 01374215 push e ...

  8. iOS中 static变量与全局、局部变量的区别 !

    static变量与全局.局部变量的区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式. 这两者在存储方式上并 ...

  9. Asp.net中static变量和viewstate的使用方法(谨慎)

    在.Net平台下进行CS软件开发时,我们经常遇到以后还要用到某些变量上次修改后的值,为了简单起见,很多人都习惯用static来定义这些变量,我也是.这样非常方便,下一次调用某个函数时该变量仍然保存的是 ...

随机推荐

  1. typeof做类型判断时容易犯下的错

    学过js同学都知道js的数据类型有 字符串.数字.布尔.Null.Undefined和object(数组.function......) 作为一个初学者我一直认为每个数据类型返回的结果是这样的 typ ...

  2. MySql 安装过程(摘自网络)

    下面的是MySQL安装的图解,用的可执行文件安装的,详细说明了一下! 打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩, 运行“setup.exe”,出现如下界面 ...

  3. C#泛型委托及约束

    泛型委托: namespace 泛型委托 { public delegate void Mydelegate<T>(T msg); class Program { static void ...

  4. diff命令

    描述 在最简单的情况是, diff 比较两个文件的内容 (源文件 和 目标文件). 文件名可以是 - 由标准输入设备读入的文本. 作为特别的情况是, diff - - 比较一份标准输入的它自己的拷贝如 ...

  5. centos解压bz2文件出错

    出现的问题: 用tar 解压 tar.bz2文件出错 debian:/usr/src# tar jxf linux-2.6.26.tar.bz2tar: bzip2: Cannot exec: No ...

  6. linux(centos7)下SVN服务器如何搭建

    linux(centos)下SVN服务器如何搭建?说到SVN服务器,想必大家都知道,可以是在LINUX下如何搭建SVN服务器呢?那么今天给大家分享一下linux(centos)搭建SVN服务器的思路! ...

  7. jquery事件绑定

    window.onload 和 Jquery $(document).ready() 区别 * .用JavaScript的方式window.onload :必须等页面上所有的元素(css/js/图片) ...

  8. Struct和Class的区别(转载)

    转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据 ...

  9. javaWEB总结(15):jsp指令_page指令

    jsp指令 jsp指令是为jsp引擎设计的.他们并不直接产生任何可见输出,而只是告诉引擎如何处理jsp页面的其余部分. 目前定义了page,include和taglib这三种指令. page指令 (1 ...

  10. excel中的数据导入oracle方法

    SQL_loader批量上传数据 1.    注释 在工作中,很多时候会遇到如下情况:需要将excel中的数据批量上传到ORACLE表中.如果是小数据量,如几十条至几百条,那么用plsql dev工具 ...