как отделить элемент кеша? - PullRequest
0 голосов
/ 16 апреля 2020

У меня возникла проблема при выполнении базовой операции c.

Технология: c#, Asp. net mvc

Я извлекаю элемент кэша и добавляю его в пакет просмотра для отображения на экране,

CacheItem temp= cache.GetCacheItem(key + "names");
ViewBag.name1=temp.Value;
VieBag.name2= temp.Value;
List<string> nameList= new List<string>();
nameList= (List<string>)temp.value;

Позже, если я изменю какое-либо одно значение, например nameList [0] = null , это приведет к изменению всех оставшихся значений

Как их можно разделить?

1 Ответ

0 голосов
/ 16 апреля 2020

Список - это тип референта, который означает, что список не хранит значение, он только указывает на значение, в этом случае имя списка указывает на некоторый список в памяти. Используя оператор =, вы копируете не значение, а ссылку на эту переменную. Вот пример для нереферентного типа:

int a = 10; int b = a; b = 20

В этом случае значение b будет 20 , а значение a будет 10 , поскольку int является типом значения.

Однако для списков это не так.

nameList= (List<string>)temp.value;

Это означает переменную nameList будет указывать на точно такой же список, на который указывает temp.value, и любое изменение одного из списков будет отражаться на другом.

Вам необходимо скопировать все элементы из одного списка в другой. В этом случае:

foreach (var item in (List<string>)temp.value) { nameList.Add(String.Copy(item); }

Обратите внимание на метод String.Copy. string также является ссылочным типом, поэтому вам необходимо создать его копию. list2.Add(item); добавит в список только существующий элемент (строку) nameList, поэтому два списка будут содержать один и тот же объект в памяти.

То же самое относится к объектам пользователя или любым другим объектам. Если вы хотите добавить эти объекты в новый список, сделайте копию объекта. Таким образом, не только список является ссылочным типом, но и объектом. Он может глубже go, потому что объект может содержать другой объект в качестве своего поля или свойства, и вам также необходимо создать его копию.

С другой стороны, если у вас был, например, список элементов типа int вам не нужно создавать копию каждого элемента, потому что int не является ссылочным типом, это тип значения. Тем не менее, вам все равно нужно будет создать новый список, потому что list является референтным типом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...