一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

asp.net 页面static变量问题

时间:2011-08-24 编辑:简简单单 来源:一聚教程网

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的区别

热门栏目