static变量作用域

变量

 
static变量与asp.net
在C#中,static变量表示该变量属于类,而不是类的实例。可以说是该类的所有实例共享一个static变量。
asp.net的页面就是一个类,我们访问一个页面。就会在服务器上实例化一个该类的实例,来响应我们的请求。

“所有实例共享一个static变量” 这就意味着,所有的客户端访问到的asp.net页面中static变量都是同一个变量。

由于我们每次访问asp.net页面都是一个全新的对象,而不是我们上一次访问的对象。所以上次页面访问时我们对页面中变量的改动都没有保留。遇到这个问题的时候,很多初学者的直觉就是将这个变量申明为static,自己在测试的时候发现还真的保留住了页面的状态。窃喜之余没有发现这又有引入了另外一个错误。因为你要的只是页面能保留住状态,而这个状态是针对一个客户端的(session的效果)。而得到的结果是只要一个客户端改变了该值所有的其他客户端都受到了影响(如同Applicatin的效果)。这种情况下,需要的极有可能就是个ViewState或者是Session。

Application与static变量
Application是通过一个集合保存所有的对象。

强类型:
Application中保存的是object,对对象的保存和使用需要作cast动作。对于值类型更需要Box&UnBox。对性能的影响较大。
而static变量是强类型的对象。

线程同步:
Application将所有的对象放到一个集合,这样对访问集合中的任何对象都会锁定这个集合。
假如有Application["A"]、Application["B"]、Application["C"],有线程访问Application["A"]其他线程不能访问Application["B"] and Application["C"]。
而static变量,可以根据他们的作用分别放在不同的class当中。这样可以并行访问不同的static变量,而不存在线程安全问题。

友情提示:
1. 对static变量,做lock时。可以通过lock(typeof(classname))来锁定该变量所在的类的类型,达到线程同步的目的。
2. 由于Aplication,static member是全局变量,而我们是在多线程服务器环境写程序,对他们的使用需要注意线程安全的问题。
 

时间: 2024-12-31 16:06:45

static变量作用域的相关文章

浅谈PHP变量作用域以及地址引用问题

 这篇文章主要介绍了PHP变量作用域以及地址引用问题,有需要的朋友可以参考一下 作用域的概念:   在PHP脚本的任何位置都可以声明变量,但是,声明变量的位置会大大影响访问变量的范围.这个可以访问的范围称为作用域.   主要的常用的包括:局部变量.全局变量.静态变量.   1.局部变量:就是在函数内声明的变量,他保存在内存的栈内,所以访问速度很快.仅在函数内有效.   2.全局变量:与局部变量相反,全局变量可以在程序的任何地方访问.只要在变量前面加关键字GLOBAL,就可以将其识别为全局变量.在

Javascript变量作用域详解

         这篇文章主要是对Javascript变量作用域进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 变量的作用域指的是变量的可见性,而生命周期则(存活期)则是从另一个角度考察变量.         JS中变量的作用域分为全局变量和局部变量,函数内定义的称为局部变量,函数外的称为全局变量.("函数外的称为全局变量"是相对的,另此处讨论的前提是用var显式声明的变量,函数内不用var定义的变量默认是全局变量,当然忽略var声明变量是不赞成的).    代码如

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

static变量与全局.局部变量的区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式. 这两者在存储方式上并无不同.这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的. 而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它.由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内

c++-请问创建一个含有static变量的namespace,static是不是没有用

问题描述 请问创建一个含有static变量的namespace,static是不是没有用 如题~请问创建一个含有static变量的namespace,static是不是没有用 解决方案 namespace和static没有关系.static的作用域是整个进程. 解决方案二: namespace和static没有关系.static的作用域是整个文件.

模块内的函数体内的static变量问题

问题描述 模块内的函数体内的static变量问题 我想问的是,在模块内的static变量是否又有函数体内跟函数体外之分,意思就是在模块内的某一个函数体内声明的static变量能否被模块内的另一个函数调用? 解决方案 函数体内声明的static变量不能被其他函数所引用,所声明的变量的作用域 只限于这个函数体内

php变量作用域的深入解析_php实例

PHP 中的每个变量都有一个针对它的作用域,它是指可以在其中访问变量(从而访问它的值)的一个领域.对于初学者来说,变量的作用域是它们所驻留的页面.因此,如果你定义了 $var,页面余下部分就可以访问 $var,但是,其它页面一般不能访问它(除非使用特殊的变量). 因为包含文件像它们是原始(包含)脚本的一部分那样工作,所以在 include() 那一行之前定义的变量可供包含文件使用.此外,包含文件内定义的变量可供 include() 那一行之后的父(包含)脚本使用. 当使用你自己定义的函数时,所有

php 变量作用域学习笔记分享

在php当中变量的作用范围php手册上是这样描述的 在用户自定义函数中,一个局部函数范围将被引入.任何用于函数内部的变量按缺省情况将被限制在局部函数范围内.例如:  代码如下 复制代码 <?php $a = 1; /* global scope */ function Test() {    echo $a; /* reference to local scope variable */ } Test(); ?> 这个脚本不会有任何输出,因为 echo 语句引用了一个局部版本的变量 $a,而且

Java的方法重载与变量作用域简介_java

方法的重载上面使用的max方法仅仅适用于int型数据.但如果你想得到两个浮点类型数据的最大值呢? 解决方法是创建另一个有相同名字但参数不同的方法,如下面代码所示: public static double max(double num1, double num2) { if (num1 > num2) return num1; else return num2; } 如果你调用max方法时传递的是int型参数,则 int型参数的max方法就会被调用: 如果传递的事double型参数,则doubl

浅析php变量作用域的一些问题_php技巧

昨晚就与到这么一个问题,是全局变量在函数中的问题.今天搜索了一下,发现一篇相当不错的文章,讲了php中的变量作用域.是一位网友翻译的在这贴一下: 变量范围变量的范围即它定义的上下文背景(译者:说白了,也就是它的生效范围).大部分的 PHP 变量只有一个单独的范围.这个单独的范围跨度同样包含了 include 和 require 引入的文件.范例: 复制代码 代码如下: <?php$a = 1;include "b.inc";?>  这里变量 $a 将会在包含文件 b.inc