Имеется массив inv класса ItemInInv, в другом классе InstantiateItem есть свойство item, которое равно ItemInInv item = inv[n]. Если изменить любое свойство в объекте item, тогда это свойство измениться в массиве. А еще у меня есть чудесная функция:
public void ReplaceItems(ref ItemInInv Last, ref ItemInInv New)
{
ItemInInv temp = (ItemInInv)Last.Clone();
Last = New;
New = temp;
}
После выполнения функции связь между объектом и массивом пропадает, а мне это не нужно. Как мне сохранить связь после выполнения функции?
Пример нерабочего кода:
class Program
{
static void Main(string[] args)
{
item[] items = new item[5];
for(int i = 0;i < items.Length; i++)
{
items[i] = new item();
}
OutputArray(items);
item n = items[0];
item x = items[1];
Change(ref n,ref x);
OutputArray(items);
Console.ReadKey();
}
public static void Change(ref item Last,ref item New)
{
item temp = (item)Last.Clone();
Last = New;
New = temp;
}
public static void OutputArray(item[] a)
{
foreach(item n in a)
{
Console.Write(n.id + " ");
}
Console.WriteLine();
}
}
class item : ICloneable
{
public static Random random = new Random();
public int id;
public item()
{
id = random.Next(0, 255);
}
public object Clone()
{
return this.MemberwiseClone();
}
}
Вроде, все логично:
Массив по определенному индексу хранит ссылки на элементы.
Вы взяли ссылку и сохранили ее в отдельную переменную:
item n = items[0];
item x = items[1];
Change(ref n,ref x);
И уже у ЭТОЙ переменной вы меняете ссылку, НО массив ничего об этом не знает и продолжает хранить старую ссылку по индексу.
Если 10 переменных ссылаются на один и тот же объект и вы одному из них присвоите null, то это не будет значить то, что все остальные элементы так же получат null.
Что бы все работало как вы хотите, вы должны передавать ссылки напрямую из массива без посредников:
Change(ref items[0], ref items[1]);
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости