Zefirot
@Zefirot

Как отражается изменения словаря на присваиваемые?

возьмем на примере 3 словаря одинаковых по структуре, 1 основной заполненный, 2 и 3 пусты, далее 2 и 3 словарю присваиваем 1й
private Dictionary<string, ClassTest> Dictionary1 = new Dictionary<string, ClassTest>();
private Dictionary<string, ClassTest> Dictionary2 = new Dictionary<string, ClassTest>();
private Dictionary<string, ClassTest> Dictionary3 = new Dictionary<string, ClassTest>();

//Dictionary1 -заполняем данными
Dictionary2 = Dictionary1;
Dictionary3 = Dictionary1;

как я понимаю если я буду менять значения в Dictionary1 то они будут меняться и в 2 и 3 словарях?
но если я буду менять значения в 2 и 3 словарях они не будут затрагивать друг друга?
то есть меняя значения в 2 словаре это никак не отразится на 3 словарь, я правильно понимаю?

А то просто во недавно столкнулся с такой проблемой что присвоил один словарь другому Dictionary2 = Dictionary1 потом 1й очистил и 2й автоматом тоже оказался очищенным, вот и уточняю...
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
ayazer
@ayazer
Sr. Software Engineer
https://docs.microsoft.com/en-us/dotnet/csharp/lan...

как я понимаю если я буду менять значения в Dictionary1 то они будут меняться и в 2 и 3 словарях?

да, так как все будут ссылатся на один и тот-же объект

но если я буду менять значения в 2 и 3 словарях они не будут затрагивать друг друга?

будут, т.к. они будут ссылатся на один и тот-же объект

то есть меняя значения в 2 словаре это никак не отразится на 3 словарь, я правильно понимаю?

нет

А то просто во недавно столкнулся с такой проблемой что присвоил один словарь другому Dictionary2 = Dictionary1 потом 1й очистил и 2й автоматом тоже оказался очищенным


это один и тот-же словарь. просто на него ссылаются две переменные.

те
private Dictionary<string, ClassTest> Dictionary1  // переменная Dictionary1 типа Dictionary<> 
    = new Dictionary<string, ClassTest>(); //которая ссылается на объект Dictionary [id=1]
private Dictionary<string, ClassTest> Dictionary2 // переменная Dictionary2 типа Dictionary<> 
    = new Dictionary<string, ClassTest>(); //которая ссылается на объект Dictionary [id=2]
private Dictionary<string, ClassTest> Dictionary3 // переменная Dictionary3 типа Dictionary<> 
    = new Dictionary<string, ClassTest>(); //которая ссылается на объект Dictionary [id=3]

//Dictionary1 -заполняем данными
Dictionary2 = Dictionary1; //переменная Dictionary2 теперь ссылается туда-же, куда и переменная Dictionary1, 
// т.е на Dictionary [id=1]

Dictionary3 = Dictionary1; //переменная Dictionary3 теперь ссылается туда-же, куда и переменная Dictionary1, 
// т.е на Dictionary [id=1]

// a объекты Dictionary [id=2] и Dictionary [id=3] будут собраны сборщиком мусора, т.к. они больше не нужны


UPD:

а как мне сделать 2 словаря по типу 1го, то есть у меня есть 1й словарь шаблон, я хочу чтобы 2й и 3й словари изначально так же и выглядели (имели все те же данные), но далее данные в них менялись независимо друг от друга?


ну например как-то так:
var dict1 = new Dictionary<int, int>()
{
    [1] = 2,
};

var dict2 = new Dictionary<int, int>(dict1);

dict1.Add(2, 3);
dict2.Add(2, 1);


var log = new Action<Dictionary<int,int>>((dict) =>
{
    Console.WriteLine(string.Join(", ", dict.Select(c => $"{c.Key}={c.Value}")));
});

log(dict1);  //1=2, 2=3
log(dict2);  //1=2, 2=1
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы