2012-01-17 76 views
1

在以下代碼中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對象中並在列表對象是相同的。 現在我向你們提出的問題是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 ! 

我想,托馬斯是對的。

+0

此外,您的第二行代碼覆蓋您的第一行。 – 2012-01-17 19:37:33

回答

4

List和Viewstate如何成爲同一個對象的引用?

它不是「ViewState」,而是ViewState的一個元素。 ViewState["L"]返回一個對象,它實際上是一個List<string>(你只是分配給myList的相同)

1

我想你在說這裏是ASP.NET。 請考慮ViewState在服務器端可用,然後在客戶機上傳輸之前,引用服務器上堆上分配的完全相同的對象。

希望這會有所幫助。

+0

實際上,每次回發後都會創建一個新的viewstate對象(我驗證了執行gethashcode())。問題是如果我將該視圖狀態轉換爲某個事物並將其分配給一個變量,那麼爲什麼該變量指向Viewstate對象?在這種情況下,它應指向一個列表的對象。 – developer747 2012-01-17 19:24:44

+0

@ user1110437:因爲我們正在討論** *對象上的**引用**。從quesiton的角度來看,Casting沒有任何*效果。 'List '和'ViewState'的*引用*進行比較,以便它們指向相同的對象'equals = true'。那是。 – Tigran 2012-01-17 19:28:45

1

視圖狀態實際上是類型的對象StateBag

StateBag的僅僅是其他對象的容器。 ViewState["L"]中的[「L」]是ViewState的索引器,它返回一些對象。在這種情況下,對象是一個List<string>對象

Equals()比較句話的意思是ViewState["L"]保持的基準是等於myList

希望舉行的參考,幫助

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