从ArrayList和ViewState之间得出的××!
晚上在瞎搞着代码,不知所谓地随便搞,拿ArrayList来存储int值,并用ViewState来缓存,以免因为页面内刷新而导致数据丢失。但是突然发现自己的代码在将数据取出到ArrayList后并对其做出修改(Add一个新的值)之后,忘记将其重新存回ViewState了,但是数据却始终保持着改变。发现之后赶快写了个例子程序,发现问题确实是ArrayList和ViewState之间所导致的,例子程序如下:
if (this.ViewState["myArray"] == null)
{
this.ViewState["myArray"] = new ArrayList();
}
ArrayList tempArray = (ArrayList)this.ViewState["myArray"];
tempArray.Add(increment);
//this.ViewState["myArray"] = tempArray; //没有这句也可以!!!
int total = 0;
foreach (object item in tempArray)
{
total += int.Parse(item.ToString());
}
Response.Write(total.ToString());
现在程序会不断地增加数值,但注意这里除了this.ViewState["myArray"] == null的时候有将其加进ViewState之外,没有地方再对其缓存了。而每次都会通过(ArrayList)this.ViewState["myArray"]获取ViewState中的值,每次对tempArray的改变事实上在ViewState中已经有所反应了。
但是int类型则不会:
{
this.ViewState["myInt"] = 0;
}
int tempVal = (int)this.ViewState["myInt"];
tempVal++;
this.ViewState["myInt"] = tempVal; //没有这句就无法更新ViewState中的数据
Response.Write(tempVal.ToString());
每次显示都只会是同一个值,total++的变化并没有反映到结果中。
会不会是值类型和引用类型的区别呢?用string做个实验:
{
this.ViewState["myString"] = "First ";
}
string tempVal = (string)this.ViewState["myString"];
tempVal = tempVal + " Value";
//this.ViewState["myString"] = tempVal; //没有这句就无法更新ViewState中的数据
Response.Write(tempVal);
得到的答案和int是一样的。 (关于string的问题可以参看你真的了解.NET中的String吗?http://terrylee.cnblogs.com/archive/2005/12/26/304876.html)
if (this.ViewState["myStringBuilder"] == null)
{
this.ViewState["myStringBuilder"] = new System.Text.StringBuilder("First");
}
System.Text.StringBuilder sb = (System.Text.StringBuilder)this.ViewState["myStringBuilder"];
sb.Append("Value");
Response.Write(sb.ToString());
用StringBuilder后,再使用Append,又能出现和ArrayList的同样效果了。
结论:等号右边的项提供了对象的实际地址,如“ = (System.Text.StringBuilder)this.ViewState["myStringBuilder"];”只要对象的地址在操作中没有发生变化,那么该操作将反映到ViewState中。
posted on 2007-06-17 03:24 volnet(可以叫我大V) 阅读(1826) 评论(9) 编辑 收藏 举报