gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:56:04 25 4
gpt4 key购买 nike

我理解结构是值类型。但我不明白为什么它会这样?是因为我没有把它当作不可变的吗?还是跟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;
}
}
}

最佳答案

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

structAsProperty.InjectValue("structAsProperty");   

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

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

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

关于c# - 为什么 C# Struct 的行为与属性不同? (与声明为字段相比),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54718374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com