其实这问题没什么可讨论的,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. 面试题-Java Web-JSP部分

    1.什么是JSP页面? JSP页面是一种包含了静态数据和JSP元素两种类型的文本的文本文档.静态数据可以用任何基于文本的格式来表示,比如:HTML或者XML.JSP是一种混合了静态内容和动态产生的内容 ...

  2. python 学习 [day8]class成员

    一.类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对 ...

  3. es6--(三)set和map数据结构

    1.Set和WeakSet Set与数组相似,但是Set结构的成员必须是唯一的. WeakSet与对象类型,但是WeakSet结构的成员只能是对象 Set结构的实例属性和方法 属性: Set.prot ...

  4. iOS CGRectContainsPoint的用法

    判断给定的点是否被一个CGRect包含,可以用CGRectContainsPoint函数 CGPoint point = [touch locationInView:self]; if(CGRectC ...

  5. C++ 简史

    Bjarne Stroustrup 这哥们在剑桥读博的时候,需要实现一个分布式的操作系统.仔细一想,自己在丹麦读大学的时候就用过 Simula,记得它的「类型表达」.「编译排错」能力以及「类」和「协程 ...

  6. C1FlexGrid小结(转自http://www.cnblogs.com/C1SupportTeam/archive/2012/12/11/2812316.html)

    C1FlexGrid控件来对一个表格格式中的数据进行显示,编辑,组和总结.该表格可以绑定到一个数据源,它可以对自己的数据进行管理. C1FlexGrid控件有一个包含以下元素的丰富的对象模型: 以下的 ...

  7. (转载)#include机制,#ifndef...#define...#endif防止重复引用,声明,定义等概念

    一.来自百度知道的问题:全局变量可以声明定义在头文件中? 答案: 注意头文件中不可以放变量的定义!!!一般情况下头文件中只放变量的声明,因为头文件要被其他文件包含(即#include).如果把定义放到 ...

  8. vcs 下使用system verilog调用c函数

    c中要加入<svdpi.h> sv的tb中加入 import "DPI-C" function int funcname(); 仿真时,vcs命令行中加入 +vc fu ...

  9. Linux系统VPS/服务器安装WINDOWS桌面环境可以采用的几个方法

    我们公司的几个项目需要在WINDOWS桌面类型的界面操作,哪怕仅有一个浏览器远程操作也是可以的,我们运维部门得到的任务就是需要能在已有的Linux系统的VPS.服务器环境中能够远程操作,至少需要能可以 ...

  10. fragment类onresume里面刷新操作处理

    今天项目中涉及fragment中嵌套多个fragment,但是要根据tag去展示对应的fragment,而不是默认展示的第一个fragment,如果使用activity很容易想到onpause(),o ...