Почему C # Struct ведет себя иначе как свойство?(сравнить с объявленным как поле) - PullRequest
0 голосов
/ 16 февраля 2019

Я понимаю, что структура это тип значения.Но я не понимаю, почему так себя ведут?Это потому, что я не относился к этому как к неизменному?или это как-то связано со свойством auto?

using System;

namespace StructQuestion
{
    class Program
    {
        static StructType structAsProperty { get; set; }
        static StructType structAsField;


        static void Main(string[] args)
        {
            structAsProperty.InjectValue("structAsProperty");
            structAsField.InjectValue("structAsField");

            //debugger says structAsProperty.GetValue() is null
            Console.WriteLine(structAsProperty.GetValue());
            Console.WriteLine(structAsField.GetValue());

            Console.ReadLine();
        }
    }

    public struct StructType
    {
        private string value;
        public void InjectValue(string _value)
        {
            value = _value;
        }
        public string GetValue()
        {
            return value;
        }
    }
}

1 Ответ

0 голосов
/ 16 февраля 2019

Давайте посмотрим, что происходит в этом утверждении:

structAsProperty.InjectValue("structAsProperty");   

Нам не нужно далеко ходить.Самое первое, что должно произойти, - это разрешить часть structAsProperty оператора.Ключевым моментом здесь является понимание того, что компилятор перезаписывает разделы get и set свойства как вызовы метода за кулисами.

Итак, что мы действительно имеем здесь, это вызов метода, который возвращает наше значение структуры.Я говорю «значение» здесь, а не «объект», потому что структуры являются типами значений .Для типов значений передача или возврат из метода приводит к копированию значения.

Теперь мы знаем достаточно, чтобы понять, что произошло.Мы вызываем InjectValue() для копии структуры свойства, а не для экземпляра в самом свойстве.Затем мы модифицируем эту копию с помощью метода InjectValue() и затем быстро забываем, что копия когда-либо существовала.

Вы можете исправить это так:

var prop = structAsProperty; //now we have a variable to keep the result of the implicit get accessor method
prop.InjectValue("structAsProperty");
structAsProperty = prop;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...