堆中的一个谜
本文关键字:一个 | 更新日期: 2023-09-27 18:20:29
在下面的代码中,ViewState["L"]
存储一个List<string>
。我创建了一个新的List
实例,并为它分配了一个视图状态的广播值
List<string> myList = new List<string>();
myList=(List<string>)ViewState["L"];
Response.Write(myList.Equals(ViewState["L"]));// returns True
正如您所看到的,.Equals()
方法告诉我Viewstate对象和List对象是相同的。现在我想问你们的问题是,List
和Viewstate
怎么能引用同一个对象?该位置的堆内存实际包含什么?
更新下面的代码演示了任何被分配了viewstate的强制转换值的变量都指向同一个对象。
List<string> myList1 = new List<string>();
myList1.Add("apple");
ViewState["L"] = myList1;
List<string> myList2 = new List<string>();
myList2 = (List<string>)ViewState["L"];
List<string> myList3 = new List<string>();
myList3 = (List<string>)ViewState["L"];;
myList3.Add("orange");//Here myList2 gets an orange too !
我认为托马斯是对的。
List和Viewstate怎么可能是对同一对象的引用?
它不是"ViewState",而是ViewState的一个元素。ViewState["L"]
返回一个对象,该对象实际上是List<string>
(与您刚才分配给myList
的对象相同)
我想您在这里谈论的是ASP.NET
。考虑到ViewState
在服务器端可用,在客户端上传输之前,您引用了服务器上堆上分配的完全相同的对象。
希望这能有所帮助。
StateBag只是其他对象的容器。ViewState["L"]
中的["L"]是ViewState的索引器,返回一些对象。在这种情况下,该对象是List<string>
对象
你的Equals()
比较是说ViewState["L"]
持有的参考等于myList
持有的参考
希望对有所帮助
您应该了解值/引用类型和运算符优先级http://msdn.microsoft.com/en-us/library/6a71f45d.aspx.
List<string> myList = new List<string>();
现在myList的前一个值已不存在,取而代之的是(ViewState["L"])
强制转换为List<string>
:
myList=(List<string>)ViewState["L"];
现在比较两个对Object
类型的引用(因为唯一合适的覆盖是Object.Equals(Object)
),一个是myList(包含(ViewState["L"])
),另一个是(ViewState["L"])
本身。结果您得到true
进行比较。
Response.Write(myList.Equals(ViewState["L"]));// returns True