我了解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;
}
}
}
答案 0 :(得分:2)
让我们看看这句话中发生了什么:
structAsProperty.InjectValue("structAsProperty");
我们不必走太远。必须发生的第一件事是解决语句的structAsProperty
部分。这里的关键是要理解编译器将属性get
和set
部分重写为幕后的方法调用。
因此,我们在这里真正拥有的是对一个返回结构值的方法的调用。我说的是“值”而不是“对象”,因为结构是值类型。对于值类型,传递给方法或从方法返回将导致值的副本。
现在我们足够了解发生了什么。我们在属性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;