从ArrayList和ViewState之间得出的××!

本文探讨了在ASP.NET中使用ViewState缓存数据时,不同数据类型(如int、string、ArrayList)的行为差异。通过实例说明了引用类型和值类型的区别及其对ViewState的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

晚上在瞎搞着代码,不知所谓地随便搞,拿ArrayList来存储int值,并用ViewState来缓存,以免因为页面内刷新而导致数据丢失。但是突然发现自己的代码在将数据取出到ArrayList后并对其做出修改(Add一个新的值)之后,忘记将其重新存回ViewState了,但是数据却始终保持着改变。发现之后赶快写了个例子程序,发现问题确实是ArrayList和ViewState之间所导致的,例子程序如下:

None.gif int  increment  =   1 ;
None.gif
if  ( this .ViewState[ " myArray " ==   null )
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
this.ViewState["myArray"= new ArrayList();
ExpandedBlockEnd.gif}

None.gifArrayList tempArray 
=  (ArrayList) this .ViewState[ " myArray " ];
None.giftempArray.Add(increment);
None.gif
// this.ViewState["myArray"] = tempArray;   // 没有这句也可以!!!
None.gif
int  total  =   0 ;
None.gif
foreach  ( object  item  in  tempArray)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    total 
+= int.Parse(item.ToString());
ExpandedBlockEnd.gif}

None.gifResponse.Write(total.ToString()); 

现在程序会不断地增加数值,但注意这里除了this.ViewState["myArray"] == null的时候有将其加进ViewState之外,没有地方再对其缓存了。而每次都会通过(ArrayList)this.ViewState["myArray"]获取ViewState中的值,每次对tempArray的改变事实上在ViewState中已经有所反应了。

但是int类型则不会:

None.gif if  ( this .ViewState[ " myInt " ==   null )
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
this.ViewState["myInt"= 0;
ExpandedBlockEnd.gif}

None.gif
int  tempVal  =  ( int ) this .ViewState[ " myInt " ];
None.giftempVal
++ ;
None.gif
this .ViewState[ " myInt " =  tempVal;  // 没有这句就无法更新ViewState中的数据
None.gif
Response.Write(tempVal.ToString()); 

每次显示都只会是同一个值,total++的变化并没有反映到结果中。

会不会是值类型和引用类型的区别呢?用string做个实验:

None.gif if  ( this .ViewState[ " myString " ==   null )
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
this.ViewState["myString"= "First ";
ExpandedBlockEnd.gif}

None.gif
string  tempVal  =  ( string ) this .ViewState[ " myString " ];
None.giftempVal 
=  tempVal  +   "  Value " ;
None.gif
// this.ViewState["myString"] = tempVal;  // 没有这句就无法更新ViewState中的数据
None.gif
Response.Write(tempVal); 

得到的答案和int是一样的。 (关于string的问题可以参看你真的了解.NET中的String吗?http://terrylee.cnblogs.com/archive/2005/12/26/304876.html

None.gif              // The Same as ArrayList
None.gif
             if  ( this .ViewState[ " myStringBuilder " ==   null )
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif {
InBlock.gif                
this.ViewState["myStringBuilder"= new System.Text.StringBuilder("First");
ExpandedBlockEnd.gif            }

None.gif            System.Text.StringBuilder sb 
=  (System.Text.StringBuilder) this .ViewState[ " myStringBuilder " ];
None.gif            sb.Append(
" Value " );
None.gif            Response.Write(sb.ToString());

用StringBuilder后,再使用Append,又能出现和ArrayList的同样效果了。

结论:等号右边的项提供了对象的实际地址,如“ = (System.Text.StringBuilder)this.ViewState["myStringBuilder"];”只要对象的地址在操作中没有发生变化,那么该操作将反映到ViewState中。

转载于:https://www.cnblogs.com/volnet/archive/2007/06/17/786105.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值