堆中的一个谜

本文关键字:一个 | 更新日期: 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对象是相同的。现在我想问你们的问题是,ListViewstate怎么能引用同一个对象?该位置的堆内存实际包含什么?

更新下面的代码演示了任何被分配了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在服务器端可用,在客户端上传输之前,您引用了服务器上堆上分配的完全相同的对象。

希望这能有所帮助。

ViewState实际上是StateBag 类型的对象

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
相关文章: