protected void Button2_Click(object sender, EventArgs e)
    {
        Label1.Text = "";
        List<string> list = new List<string>();
        list.Add("1");
        list.Add("2");
        Application.Add("app1", list);        List<string> list2 = Application["app1"] as List<string>;        //移除app1,输出然后是正常的,也就是说移除application对象不影响list,list是新复制的对象
        Application.Remove("app1");
        foreach (string item in list2)
        {
            Label1.Text += item + "<br />";
        }
    }
    protected void Button3_Click(object sender, EventArgs e)
    {
        Label1.Text = "";
        List<string> list = new List<string>();
        list.Add("1");
        list.Add("2");
        Application.Add("app1", list);        //取出app1并添加一个3
        List<string> list3 = Application["app1"] as List<string>;
        list3.Add("3");        //重新取出app1,输出是添加了3后的结果,也就是说修改list3会影响Application对象,说明是引用
        List<string> list4 = Application["app1"] as List<string>;
        foreach (string item in list4)
        {
            Label1.Text += item + "<br />";
        }我有点说不明白,整理这段代码,希望大家能明白我的意思。
就是发现application里的对象对于引用类型的获取又象引用又象复制。到底是什么原因呢?

解决方案 »

  1.   

    上面的代码看起来是List是复制 Application是引用啊
    因为第一个你是用Application去拿List 结果List就复制了一个给Application
    第二个是你要从Application里面拿东西出来 那个就是引用了
    所以在修改的时候也会被修改到
      

  2.   

    dwp008
    第二个是你要从Application里面拿东西出来 那个就是引用了list4居然是application的一个引用,那么,为什么删除application对象,这个引用的对象还存在,在label里依然能有这些值呢,而不是消毁了呢?
      

  3.   

    Application.Remove("app1");
    这个应该并不是删除对象 而是对对象引用的删除
    你可以试着用
     Label1.Text = "";
            List<string> list = new List<string>();
            list.Add("1");
            list.Add("2");
            Application.Add("app1", list);        List<string> list2 = Application["app1"] as List<string>;        //移除app1,输出然后是正常的,也就是说移除application对象不影响list,list是新复制的对象
            //Application.Remove("app1");
            Application["app1"] = null;//赋值为空
            foreach (string item in list2)
            {
                Label1.Text += item + "<br />";
            }这样list2就为空了
      

  4.   

    恩 应该说这两个对象都是引用类型的,所以他们之间都是浅复制
         Label1.Text = "";
            List<string> list = new List<string>();
            list.Add("1");
            list.Add("2");
            Application.Add("app2", list);
            list.Add("5");        List<string> list2 = Application["app2"] as List<string>;        //移除app1,输出然后是正常的,也就是说移除application对象不影响list,list是新复制的对象
            //Application.Remove("app1");
            //Application["app1"] = null;
            foreach (string item in list2)
            {
                Label1.Text += item + "<br />";
            }这个最后会输出 125
      

  5.   

    Application.Remove("app1");
    这个只是删除掉引用关系而已
      

  6.   

           List<string> list2 = Application["app1"] as List<string>;
    //null
            Application["app1"] = null;
            foreach (string item in list2)
            {
                Label1.Text += item + "<br />";
            }
    还是能输出1,2,也就是说将application对象赋为null,list2还是存在,那么,获取application是复制对象的。