Объект в куче загадки - PullRequest
1 голос
/ 17 января 2012

В приведенном ниже коде 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 могут быть ссылкой на один и тот же объект?Что на самом деле хранится в куче памяти в этом месте?

Обновление Приведенный ниже код демонстрирует, что все переменные, которым присваивается значение преобразования состояния представления, все указывают на один и тот же объект.

   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 ]

4 голосов
/ 17 января 2012

как List и Viewstate могут быть ссылкой на один и тот же объект?

Это не "ViewState", а элемент ViewState.ViewState["L"] возвращает объект, который на самом деле является List<string> (тот же, который вы только что присвоили myList)

1 голос
/ 17 января 2012

ViewState на самом деле является объектом типа StateBag

StateBag - это просто контейнер других объектов.["L"] в ViewState["L"] является индексатором ViewState, который возвращает некоторый объект.В этом случае этот объект является List<string> объектом

Ваше Equals() сравнение говорит о том, что ссылка, поддерживаемая ViewState["L"], равна ссылке, удерживаемой myList

помогает

1 голос
/ 17 января 2012

Полагаю, вы говорите о ASP.NET здесь.Учтите, что ViewState доступно на стороне сервера, и перед передачей на клиента вы ссылаетесь на точно такой же объект, выделенный в куче на сервере.

Надеюсь, это поможет.

0 голосов
/ 17 января 2012

Вы должны прочитать о типах значений / ссылок и приоритетах операторов 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
...