为什么C#Struct的行为不同于属性? (与声明为字段相比)

时间:2019-02-15 23:31:41

标签: c# struct

我了解struct是值类型。但是我不明白为什么会这样表现? 是因为我没有将其视为一成不变的吗?还是与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 :(得分:2)

让我们看看这句话中发生了什么:

structAsProperty.InjectValue("structAsProperty");   

我们不必走太远。必须发生的第一件事是解决语句的structAsProperty部分。这里的关键是要理解编译器将属性getset部分重写为幕后的方法调用

因此,我们在这里真正拥有的是对一个返回结构值的方法的调用。我说的是“值”而不是“对象”,因为结构是值类型。对于值类型,传递给方法或从方法返回将导致值的副本

现在我们足够了解发生了什么。我们在属性struct的副本上调用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;