gpt4 book ai didi

c# - 什么时候自动复制记录结构?

转载 作者:行者123 更新时间:2023-12-02 18:15:03 25 4
gpt4 key购买 nike

考虑以下可执行示例:

namespace MyNamespace;

public record struct Record()
{
public bool DoSomething { get; set; } = false;

public void SetDoSomething(bool newValue)
{
DoSomething = newValue;
}
}

public static class Program
{
public static readonly Record MyObject = new();

public static void Main()
{
MyObject.SetDoSomething(true);

Console.WriteLine($"MyObject.DoSomething: {MyObject.DoSomething}");
/* Output:
* false - current version
* true - if MyObject is not readonly or Record is defined as record class
*/
}
}

我试图理解,为什么在调用将属性设置为 true 的方法后,DoSomething 仍然为 false。

我的猜测是,调用该方法时会创建一个副本。如果 Record 是引用类型(记录类),则不会发生这种情况,这是有道理的。但是,如果删除 readonly 修饰符,为什么 MyObject 不会被复制呢?

最佳答案

它被称为防御性复制,由C#编译器执行,以强制执行值类型的语义,通常不建议在非值类型上标记readonly -readonly struct 因为这样的事情会发生并进一步导致性能下降,还有一些类似的场景值得一提,更具体地说:

x.Y causes a defensive copy of the x if:

  • x is a readonly field and
  • the type of x is a non-readonly struct and
  • Y is not a field.

The same rules are applied when x is an in-parameter, ref readonly local variable or a result of a method invocation that returns a value by readonly reference.

这里的record修饰符实际上并不重要,您将值类型的字段标记为readonly,因此编译器认为它应该保留语义,即值类型始终不变。当您调用方法或访问该字段的属性时,编译器不会知道该方法或属性是否实际上没有副作用,因此它会做出保守的决定,即防御性副本来避免它。 p>

您可以查看The ‘in’-modifier and the readonly structs in C#查看更多信息和 Avoiding struct and readonly reference performance pitfalls with ErrorProne.NET

关于c# - 什么时候自动复制记录结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71709569/

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