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

        如今转入了BS软件开发。我们非常自然地会沿用这样的习惯。

如在页面中统计某个button被按下的次数,先在类中OnClick事件的处理过程前定义一static变量times,则每次调用该button的OnClick事件时,令times增1就可以。非常方便:



[C#]:

...
static int times=0;
...
private void Button1_Click(object sender,EventArgs e)
{
times++;
Label1.Text=times.ToString();
}

在我们庆幸如此方便之余。就未曾意识到我们已经埋下了一棵难以察觉的定时炸弹。为什么哪?

        这还要从Asp.net的执行机制谈起。在CS模式软件开发过程中,我们通常不会关心应用程序是在哪里执行的,变量存放在哪里,client程序就执行在client,server端程序就执行在server端,普通情况下,二者除了数据库中的数据外基本没有其它共享的东西。所以这时client的用户大可放心的使用static变量,由于它们就存放在client程序中。

于是我们就习惯的在做BS模式的页面时也用static变量,殊不知Asp.net中的static已不同于CS中的static。

原因非常easy,就是由于在Asp.net中全部的用户将使用同一个static变量。这就意味着每个使用该页面的用户对该变量的操作将会影响到其它用户。

就拿上面计数器的样例来说。假设times初试值为0,由于此时仅仅有我们自己在使用这个页面,当然不会有什么问题,但假设有两个人同一时候连接到这个页面,假设A单击了Button1一次,则B刷新页面后Label1将显示1,假设B再单击Button1一次,则times变成2,两个人刷新页面后就出现故障了:A和B都会说,我明明仅仅单击了Button1一次,怎么Label1就显示我单击了两次哪?——这就是由于两个人共用的是server上同一个times,不论什么一个人对times的操作都会在使用该页面的他人的浏览器中表现出来。问题就出在这里。

        怎么办哪?还好,除了传统的Asp中的Session对象外。Asp.net提供了一个更好的ViewState对象。

ViewState对象用来保存页面中的各种变量,甚至是对象。

用法和HashTable类似。仅仅要用变量名称做索引。如ViewState["Var"],就能够用存取变量Var的值,而无论Var是普通变量,还是对象,甚至是内存中的一张DataTable,太方便了。为什么能够用ViewState而不能用static变量哪?原因就是server端会为每一个连接到该页面的用户分别建立一个ViewState,所以ViewState相当于页面级的Session。这下我们能够放心地使用ViewState来存取须要暂寸的变量和对象了。

ViewState的使用方法非常easy,例如以下所看到的:

1、保存变量到ViewState中:

<pre name="code" class="csharp">      <span style="font-family: Arial, Helvetica, sans-serif;">ViewState["times"]=times;//存放普通变量times</span>
      <span style="font-family: Arial, Helvetica, sans-serif;">ViewState["Orders"]=dtOrders;//存放DataTable型对象dtOrders</span>


2、读出ViewState中的值:

<pre name="code" class="csharp">      <span style="font-family: Arial, Helvetica, sans-serif;">times=(int)ViewState["times"];</span>
      <span style="font-family: Arial, Helvetica, sans-serif;">dtOrders=(DataTable)ViewState["Orders"];</span>

看见了吧?就如此简单!有的朋友会问读出变量的值时为什么要进行强制类型转换?这是由于当变量(无论是int型的普通变量times,还是DataTable型的对象dtOrders)被存放到ViewState中后,ViewState可无论你是普通变量还是对象,统统按Object来对待。

所以当我们取出存放在ViewState中的东西时,一定要转换成对应的类型,否则就会报错。

而这一操作不用在用ViewState保存变量时进行。系统会自己主动转换。(注意ViewState括号里的字符串仅仅是为了标识不同变量的索引。用不着非要和变量同名)所以上面计数器的代码应该这样写才好:

       ...
ViewState["times"]=0;
...
private void Button1_Click(object sender,EventArgs e)
{
int times=(int)ViewState["times"];
times++;
ViewState["times"]=times;
Label1.Text=times.ToString();
}

这是不是说static型变量就没用了哪?当然不是!在C#中用static声明的类不用实例化直接使用。正是因为全部用户共享server端的同一个static变量,所以能够用static型对象来存取一些公用的处理模块。比方类型转换、变量验证等工作。

所以要依据详细情况而定。

另一点须要注意:假设在页面中多个过程要共享一个对象或变量。我们在页面类的開始部分定义一个页面级的全局变量是不行的,static本来能够,但上面说了这样的类型的变量不安全,所以这时就能够用ViewState。

好了,这下我们能够放心的暂存某些变量或对象了。

慎重Asp.net中static变量的使用方法的更多相关文章

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

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

  2. c++ 类与函数中static变量初始化问题(转)

    首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数: void Foo() { ; // initialize std::cout << a; a++; } 里的 ...

  3. java中static变量和方法的总结

    转自:http://blog.csdn.net/haobo920/article/details/5921621 java中static变量和方法的总结 java中一切皆是对象 一个类中对象的定义一般 ...

  4. ASP.NET中XML转JSON的方法

    原文:ASP.NET中XML转JSON的方法 许多应用程序都将数据存储为XML的格式,而且会将数据以JSON的格式发送到客户端以做进一步处理.要实现这一点,它们必须将XML格式转换为JSON格式. X ...

  5. ASP.net中导出Excel的简单方法介绍

    下面介绍一种ASP.net中导出Excel的简单方法 先上代码:前台代码如下(这是自己项目里面写的一点代码先贴出来吧) <div id="export" runat=&quo ...

  6. C++中输出变量类型的方法

    C++中输出变量类型的方法 在c++中输出变量或者数据类型,使用typeid().name()的方法.如下例子: #include <iostream> #include <stri ...

  7. 谨慎Asp.ne B/S架构t中static变量

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

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

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

  9. Java多线程中static变量的使用

    轉:https://blog.csdn.net/yy304935305/article/details/52456771 鲁迅先生曾说过:“时间就像海绵里的水,只要愿挤,总还是有的”.不管肿(怎)么说 ...

随机推荐

  1. LinearLayout-控件不显示

    今天Mms遇到了一个问题,布局如下             <RelativeLayout                android:layout_width="match_par ...

  2. 23. Node.Js Buffer类(缓冲区)-(三)文件读取实例

    转自:https://blog.csdn.net/u011127019/article/details/52513109

  3. npm install (让别人下载自己的包)

    好几天没更新了,再这里跟大家说声抱歉,今天来点干货. 发布一个包在npm上,可以供世界所有人使用,想一下,以前我们做项目,都是在npm install 别人的包,什么时候才能install我们自己的包 ...

  4. jmeter--FTP测试

    FTP服务主要提供上传和下载功能.有时间需要我们测试服务器上传和下载的性能.在这里我通过JMeter做一个FTP测试计划的例子. 当然,JMeter官方网站的用户手册也有例子,但由于版本较早,我也算是 ...

  5. C# Find() 与 FindAll()方法的使用

    Find()   :检索与指定匹配的第一个元素 FindAll()   : 检索与指定匹配的所有元素 如:List<string> strList=new List<string&g ...

  6. STM32W108无线射频模块串行通信接口编程实例

    STM32W108无线射频模块UART通信应用实例 基于STM32W108芯片,编写串口測试程序,測试串口通信.完毕PC通过串口与STM32W108进行通信. 开发环境与硬件平台 硬件:STM32W1 ...

  7. 9. ZooKeeper之搭建单机模式。

    转自:https://blog.csdn.net/en_joker/article/details/78673456 在集群和单机两种模式下,我们基本完成了分别针对生产环境和开发环境ZooKeeper ...

  8. 2.Web开发过程流程图

    转自:https://blog.csdn.net/hello_simon/article/details/19993343 最近公司在进行一系列新模块的开发,在痛苦开发的过程中,大家不时在一起进行总结 ...

  9. js进阶 13-8 jquery如何实现侧边栏

    js进阶 13-8 jquery如何实现侧边栏 一.总结 一句话总结:先是把侧边栏设置为left为-100px,隐藏起来,jquery自定义动画animate里面的改变元素的距左边的宽度left,sl ...

  10. Visual C# 2008 调试技巧

      1,非中断模式下的调试. 利用系统“输出”窗口.(视图-输出)来打印调试信息.有Debug和Release两种版本,通过运行按钮右边的选项可以选择程序的运行方式.而对应的现实调试信息的方法也不同. ...