关于C#静态变量初始化问题
关于这个静态变量,平时自己没有太认真的去认识。最近调项目的bug,让我重新认识了静态变量的特点。
其实,我们一直都在说:静态变量只在类第一次初始化的时候进行初始化,以后都不初始化。
很简单的一句话,但是我们有没有结合“网站”的特点进行理解??看下面一段代码
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
public static string UserDepartment ="默认部门A";
public string UserID;
protected void Page_Load(object sender, EventArgs e)
{
UserID = Session["UserID"].ToString();
if ("" == UserID)
{
UserDepartment = "人力资源部门";
}
}
}
}
这段代码中,根据登陆用户的ID信息,来确定这个用户的部门信息。我们将UserDepartment设置为了静态变量。问题出现了:
当第一个用户登陆之后,UserDepartment初始化为“默认部门A”,如果这个用户的ID为“00001”,那么这个类的静态变量就被修改了,改为“人力资源部门”。
注意:这是一个网站,网站上的逻辑代码在不停的运行,这个类的信息也很有可能被其它用户所访问。所以,当其它非“00001”用户访问该网站的这个页面的时候,加载这个页面类_Default,UserDepartment为这个类的静态变量,so不会再次初始化。所以,UserDepartment的值是“人力资源部门”,而且以后所以的用户登录,UserDepartment这个变量的值都不会再变化了。
为什么会出现这种情况呢?因为我们错用了static修饰了UserDepartment。
静态变量之所以为静态,其含义就是这个变量是这个类的固有属性,除非你手动修改这个固有属性,否则它不会发生改变,而且不会多次进行初始化。他是服务器级别的全局静态变量信息。对于静态变量我们要了解它的特点并且合理的使用。
非静态变量则不一样,它根据每一次请求出过来的参数的不同而改变,所以需要每次加载类的时候首先对他们进行初始化。
深入一点,看看这个http://www.cnblogs.com/meyer/archive/2004/04/27/7846.html
关于C#静态变量初始化问题的更多相关文章
- 类加载, 静态变量初始化, String不可变, 泛型使用, 内部类
1.java变量类型 java变量类型分:基本数据类型变量和Object数据类型变量,变量也是占用者内存的 例如: int i = 3; i这个变量保存的就是整形3, 占32位 Object a = ...
- C++全局和静态变量初始化
转自:http://www.cnblogs.com/zhenjing/archive/2010/10/15/1852116.html 对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的 ...
- java非静态变量初始化
java费静态变量的初始化分为两种情况,一种是局部变量,一种是类的域. 对于类的域,java在类初始化时,会为变量赋一个初始值.对于基本数据类型,java会将初始值设置为二进制0,具体为将boolea ...
- java 静态变量初始化
java 静态变量在编译阶段就已经明确位置, 所以静态变量的声明与初始化在编码顺序上可以颠倒.也就是说可以先编写初始化的代码,再编写声明代码.如: public class Test { // 静态变 ...
- Java静态方法,静态变量,初始化顺序
1. 静态方法: 成员变量分为实例变量和静态变量.其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量.而静态变量被该类所有的对象公有(相当于全局变量),不需要实 ...
- Java的静态变量初始化的坑
在网上看到一个很有意思的题目,题目如下 class SingleTon { private static SingleTon singleTon = new SingleTon(); public s ...
- Java静态变量初始化的坑
class SingleTon { private static SingleTon singleTon = new SingleTon(); public static int count1; pu ...
- java子父类初始化顺序 (1)父类静态代码块(2)父类静态变量初始化(3)子类静态代码块(4)子类静态变量初始化(5)main(6)有对象开辟空间都为0(7)父类显示初始化(8)父类构造(9)子类显示初始化(10)子类构造
标题 静态代码块与静态成员变量还要看代码的先后顺序 看程序,说出结果 结果为: x=0 看程序,说出结果 结果如下: 补充 : 静态代码块:static{ } 在JVM加载时即执行,先于主方法执行,用 ...
- 转:Java的一道面试题----静态变量初始化过程
public class Test{ private static Test tester = new Test(); //step 1 private static int count1; //st ...
随机推荐
- SpringMVC 框架的搭建及基本功能的实现
首先新建一个WEB项目 导入jar包 我们基于Spring mvc框架进行开发,需要依赖一下的spring jar包: spring-aop-4.0.4.RELEASE.jar spring-bean ...
- 自己写的几个android自定义组件
http://www.see-source.com/androidwidget/list.html 多多指点,尤其是自定义组件的适配问题,希望能有更好的方法
- CSS基础篇之选择符2
属性选择符: 选择符 版本 描述 E[att] CSS2 选择具有att属性的E元素. E[att="val"] CSS2 选择具有att属性且属性值等于val的E元素. E[at ...
- asp.net identity UserSecurityStamp 的作用
UserSecurityStamp 主要是用来对用户安全相关信息做一个快照. 在使用asp.net identity 的 CreateAsync(TUser user) 创建一个用户的时候,如果开启了 ...
- Nova PhoneGap框架 第四章 本地数据库
我一直想把EntityFramework(简称EF)的那一套搬过来,应用于HTML5 SQLite. 幸运的是,我几乎做到了,有些功能无法完成的那是因为SQLite本身不支持.至少从现在已经完成的功能 ...
- 从零3D基础入门XNA 4.0(1)——3D开发基础
[题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...
- MySQL 常用的UPDATE操作
标签:UPDATE 概述 测试环境:mysql 5.6.21 步骤 创建测试表 CREATE TABLE `product` ( `proID` ) NOT NULL AUTO_INCREMENT C ...
- Tomcat搭建
标签:Tomcat 概述 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选. ...
- CSS3 制作一个边框向周围散开的按钮效果
我们将要达到的是如下的效果(若效果未出现请刷新): 分析 主要还是运用CSS3的transition, animation, transform还有渐变背景等特性. 由于按钮在鼠标进入时有不同的样式, ...
- oracle数据库的安装、配置与无残留卸载
安装配置 :关闭专用网络防火墙 2 :以管理员身份运行安装文件 ——“setup.exe” 3 :设置口令 其中SYS 用户权限大于 SYSTEM 4 :先决条件检查,若验证成功,点击 ”下 ...