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的区别
电神魔傀2街机免费版 官方版v1.2.1
下载三国战纪2手游腾讯渠道服 安卓版v2.41.0.0
下载三国战纪2手游抖音渠道服 安卓版v2.41.0.0
下载三国战纪2折扣服 安卓版v2.41.0.0
下载叫我大掌柜小米版 安卓版v7.4.4
叫我大掌柜小米版是这款模拟经营类手游的渠道服版本,在此版本中
cooking fever正版 安卓最新版v23.0.2
cooking fever正版是一款非常好玩的模拟经营类手游
咖啡厅的生活故事 最新版v1.7
咖啡厅的生活故事是一款模拟经营游戏,玩家们在游戏中可以经营一
迅猛龙模拟器金币不减反增版 v1.1.8
迅猛龙模拟器无限金币版是一款动物模拟类游戏,玩家们将在游戏中
泽塔奥特曼升华器免广告版 v1.4
泽塔奥特曼升华器去广告版是游戏的破解版本,在该版本中为玩家去