Существуют типы значений и ссылочные типы в C # . Словарь является ссылочным типом, поэтому при назначении переменной, содержащей ссылочный тип, ссылка копируется, что означает, что обе переменные будут содержать одни и те же данные. Итак, если вы измените данные , вы должны ожидать, что они изменятся для обеих переменных:
List<int> list1 = new List<int>() { 1, 2, 3 };
List<int> list2 = list1;
list2.Add(10);
list1.ForEach(x => Console.WriteLine(x)); // should print 1, 2, 3 and 10.
Однако, если вы переназначаете переменную, то вы не меняете данные:
List<int> list1 = new List<int>() { 1, 2, 3 };
List<int> list2 = list1;
list2 = new List<int>() { 10, 11, 12 };
list1.ForEach(x => Console.WriteLine(x)); // should print 1, 2, 3 only
Одна вещь, которая привлекла мое внимание в вашем коде, это то, что конструктор ожидает ref
. Это означает, что вы передаете ссылку непосредственно по ссылке, которая в C ++ будет выглядеть как двойной указатель (type**
). Вы сделаете это, если в приведенном выше фрагменте вы хотите получить такой эффект:
void MethodA(ref List<int> list)
{
list = new List<int>() { 10, 11, 12 };
}
// ...
List<int> list1 = new List<int>() { 1, 2, 3 };
MethodA(ref list1);
list1.ForEach(x => Console.WriteLine(x)); // should print 10, 11, 12
Еще одна вещь - AFAIK C # не реализует глубокие копии ни в одном из этих классов. Вы должны сделать это самостоятельно.