1

Вопрос, конечно, по чистому C#. Но тег Unity3d я поставил, потому что пример оттуда.

Есть два класса:

public class A : MonoBehaviour
{
    Vector2 vec = Vector2.zero;
    void Start()
    {
        vec.x = 10f;
    }
}

public class B : MonoBehaviour { Vector2 vec {get; set; }= Vector2.zero; void Start() { vec.x = 10f; } }

Единственное отличие - свойство (get; set; структура).

Тут стоит уточнить, что Vector2 - это структура (struct), а не класс (class). Vector2 имеет несколько полностью публичных (public) полей, одно из которых - x.

В первом классе всё замечательно! Поле x у структуры Vector2 меняется на 10f и никаких ошибок. Во втором классе есть ошибка: "CS1612 Не удалось изменить возвращаемое значение 'B.vec', т. к. оно не является переменной". Я понимаю, что присутствие свойства вызывает ошибку... Но я не понимаю почему? Свойства как-то особенно работают со структурами из-за того, что они не являются ссылочными типами?

Так вот, мой вопрос. Почему наличие свойства "{get; set;}" (и любого другого свойства с "get"-ером) запрещает мне менять поля структуры (struct)?

SLiver
  • 216
  • 1
  • 9
  • 1
    https://stackoverflow.com/a/1747702/6808809 – EvgeniyZ Nov 24 '23 at 01:42
  • 4
    Не запрещает, просто геттер, будучи функцией, выдаёт вам копию структуры. Которую вы меняете, но не присваиваете назад через сеттер. При работе с полем вы используете напрямую оригинал структуры. – VladD Nov 24 '23 at 01:44
  • Посмотрите пример с MutableStruct здесь. – VladD Nov 24 '23 at 01:47
  • Да, как написал @VladD, свойства это всего лишь синтаксический сахар, которые под капотом int Value { get; set; } превращает в самые обычные методы int GetValue () и void SetValue (int value) и мы получаем только копию не ссылочного типа. – Yaroslav Nov 24 '23 at 01:52
  • Попробуйте var copy = vec; copy.x = 10; vec = copy; или просто vec = new Vector2(10, vec.y);. – VladD Nov 24 '23 at 01:55
  • Использование иммутабельных структур более правильно, для них подобных проблем не возникает. – VladD Nov 24 '23 at 02:00

0 Answers0