asp教程.net 页面static变量问题
static变量只在第一次使用时才初始化(可能早于也可能晚于Main函数).c中的全局变量存在早于main函数.
static有修饰限定词,全局变量无.
static的机制复杂得多,其初始化次序有可能引起竞争问题(比如两个类的static成员的初始化都依赖对方时),全局变量不存在这些问题.
测试代码如下:
View Code public partial class _Default : System.Web.UI.Page
{
private static string str;
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
str = "这是个static变量赋值"+DateTime.Now;
}
}
protected void Button1_Click(object sender, EventArgs e)
{
this.TextBox1.Text = str;
}
}
我用火狐连续打开3个页面点击按钮显示的值都是同样的(把连接赋值到IE下值就变了)
View Code public partial class _Default : System.Web.UI.Page
{
//private static string str;
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
//str = "这是个static变量赋值"+DateTime.Now;
ViewState["Key"] = "这是个static变量赋值" + DateTime.Now;
}
}
protected void Button1_Click(object sender, EventArgs e)
{
this.TextBox1.Text = ViewState["Key"].ToString();
}
}
这种情况下,需要的极有可能就是个ViewState或者是Session。
Application与static变量
Application是通过一个集合保存所有的对象。
强类型:
Application中保存的是object,对对象的保存和使用需要作cast动作。对于值类型更需要Box&UnBox。对性能的影响较大。
而static变量是强类型的对象。
改为ViewState正常
非泛型类并且非ThreadStatic的static变量在一个AppDomain中只存在一份
换而言之,不同AppDomain里面的同一个static变量可以不同
泛型类的static变量是每个具体类型一个
ThreadStatic的static变量是每个线程一个
至于能不能访问,要看变量的访问修饰符和所在类的访问修饰符
static变量不是一直存在的,clr会在使用这个变量之前帮你准备好
因此在使用这个变量之前并不知道它是否存在,唯一可以知道的是在使用时,它一定存在(当然可能是null)
至于什么时候clr准备好这个静态变量,又有BeforeFieldInit和非BeforeFieldInit的区别
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔