Пропадает связь между объектами

122
02 августа 2019, 05:00


Имеется массив 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();
        }
    }
Answer 1

Вроде, все логично:

Массив по определенному индексу хранит ссылки на элементы.

Вы взяли ссылку и сохранили ее в отдельную переменную:

item n = items[0];
item x = items[1];
Change(ref n,ref x);

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

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

Что бы все работало как вы хотите, вы должны передавать ссылки напрямую из массива без посредников:

Change(ref items[0], ref items[1]);
READ ALSO
Функция которая объединяет три строки в одну

Функция которая объединяет три строки в одну

Я написал функцию, которая объединяет три строки в одну, но я только учу C# поэтому ничего не вышлоПодскажите, почему мой код не работает:

122
Оптимизации сортировки массива

Оптимизации сортировки массива

У меня есть два цикла "for"Когда записей ~100 они работают быстро, но когда записей больше 100000 скорость обработки может быть и час

209
Удаление связанных данных Entity Framework

Удаление связанных данных Entity Framework

Есть связанные классы:

150
В c# определить переменную условной компиляции в другом проекте

В c# определить переменную условной компиляции в другом проекте

Можно ли в c#, visualstudio определить переменную условной компиляции в другом проекте?

143