在下面的代码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对象是相同的。
现在我向你们提问的是List
和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 !
我认为,托马斯是对的。
答案 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