Zefirot
@Zefirot

Почему массив работает как словарь?

Были некоторые проблемы со словарями из-за того что где-то менялись значения и при этом они менялись в самих словарях изначально от куда брались данные, так как это ссылки...
Вот я и начал использовать массив, но тут произошла та же самая проблема
[Serializable] public class ClassTest{
  private int a; public int Life{ get{ return a; } set{ a = value; }}
  private string b; public string Name{ get{ return b; } set{ b = value; }}
  ............
  }
......
public ClassTest[] ArrayClassTest;
....
ArrayClassTest[0].Life = 100;
ArrayClassTest[0].Name = "Test";
ArrayClassTest[1].Life = 100;
ArrayClassTest[1].Name = "Test";
.....
ArrayClassTest[0].Life = 5;
Debug.Log(ArrayClassTest[0].Life);
Debug.Log(ArrayClassTest[1].Life);

вывод
5
5

Почему так, как этого избежать?
  • Вопрос задан
  • 99 просмотров
Решения вопроса 2
insighter
@insighter
-First time? - Huh? (C#, React, JS)
Дело уж точно не в том где вы храните данные - массив, словарь, список, а в том что храните и как этим манипулируете.

Допустим имеете дело с классом
public class Point{
  public int X{ get; set;}
  public int Y{ get; set;}
}

var points = new Point[1];
var point = new Point();
points[0] = point; // points[0] и point указывают на один и тот же объект
points[0].X = 10; // point.X == 10

Потому, что класс это ссылочный (мутабельный - тоже имеет значение) тип данных

Другой пример:
public struct StructPoint{
  public int X{ get; set;}
  public int Y{ get; set;}
}
var point = new StructPoint();
points[0] = point; // points[0] и point имеют одинаковое значение! т.е. (points[0] == point) но ссылаются на разные области памяти
points[0].X = 10; // point.X == 0

Потому, что структура это значимый тип данных

Для строк, поведение будет примерно как для структур хотя они ссылочные. Потому что строки иммутабельные, когда меняется строка на самом деле создается новая.

https://metanit.com/sharp/tutorial/2.16.php
Ответ написан
Комментировать
vabka
@vabka Куратор тега C#
Токсичный шарпист
Значит ArrayClassTest[0] и ArrayClassTest[1] - это один и тот же объект.
Создавай два разных объекта через new и проблемы не будет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы