堆谜语中的一个对象

时间:2012-01-17 19:17:49

标签: c# heap-memory

在下面的代码ViewState["L"]中存储List<string>。我创建了一个List的新实例,并为其分配了一个viewstate的转换值。

List<string> myList = new List<string>();

myList=(List<string>)ViewState["L"];

Response.Write(myList.Equals(ViewState["L"]));// returns True

如您所见,.Equals()方法告诉我Viewstate对象和List对象是相同的。 现在我向你们提问的是ListViewstate如何成为对同一个对象的引用?该位置的堆内存实际上是什么?

更新 下面的代码演示了任何被赋予视图状态转换值的变量都指向同一个对象。

   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 !

我认为,托马斯是对的。

4 个答案:

答案 0 :(得分:4)

  

List和Viewstate如何成为对同一对象的引用?

它不是“ViewState”,而是ViewState的一个元素。 ViewState["L"]会返回一个实际为List<string>的对象(您刚刚分配给myList的那个对象)

答案 1 :(得分:1)

我想你在这里谈论ASP.NET。 考虑到ViewState在服务器端可用,在客户端上传输之前,您引用服务器上堆上分配的完全相同的对象。

希望这有帮助。

答案 2 :(得分:1)

ViewState实际上是StateBag

类型的对象

StateBag只是​​其他对象的容器。 ViewState["L"]中的[“L”]是ViewState的索引器,它返回一些对象。在这种情况下,该对象是List<string>对象

您的Equals()比较表明ViewState["L"]所持的引用等于myList

所持有的引用

希望有所帮助

答案 3 :(得分:0)

您应该阅读值/引用类型和运算符优先级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"];

现在比较2个Object类型的引用(唯一合适的覆盖是Object.Equals(Object)),一个myList(包含(ViewState["L"]))和另一个(ViewState["L"])本身。因此,您可以true进行比较。

Response.Write(myList.Equals(ViewState["L"]));// returns True