Имеется массив 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]);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я написал функцию, которая объединяет три строки в одну, но я только учу C# поэтому ничего не вышлоПодскажите, почему мой код не работает:
У меня есть два цикла "for"Когда записей ~100 они работают быстро, но когда записей больше 100000 скорость обработки может быть и час
Можно ли в c#, visualstudio определить переменную условной компиляции в другом проекте?