gpt4 book ai didi

C# 结构 : Mutability versus Performance

转载 作者:行者123 更新时间:2023-11-30 14:34:17 25 4
gpt4 key购买 nike

我意识到结构是不可变的,改变结构是邪恶的,改变结构中值的正确方法是创建新实例。但是,我不清楚新实例与允许结构可变的内存和性能方面/问题。

假设我有结构,

struct Vehicle
{
public readonly int Number;
public readonly double Speed, Direction;

public Vehicle(int number, double speed, double direction)
{
this.Number = number;
this.Speed = speed;
this.Direction = direction;
}
}

并将其创建为:
Vehicle car;


Vehicle plane = new Vehicle(1234, 145.70, 73.20)

如果我稍后需要分配给 Number、Speed 或 Direction,我可以删除 readonly 并使结构可变 - 我知道这样做是邪恶的。 - 从而“改变”一个已经创建的结构值。

或者,我可以创建一个新的结构实例。所以不要说 car.Speed = 120.7;我可以说 car = new Vehicle(car.Number, 178.55, car.Direction);。这将创建一个几乎与旧值一样的新结构值,只是速度发生了变化。但它不会改变现有的结构值。

这是问题。假设,作为一个极端的例子,我需要每秒更新速度和/或方向许多、数千次。我认为创建这么多实例会严重影响内存和性能,在这种情况下,最好允许结构可变。

任何人都可以澄清可变结构的内存和性能问题与在这种极端情况下实现结构的正确方法吗?

最佳答案

您需要自己回答的问题是“我正在编写的类型的预期语义是什么?”

一个 struct应该使用而不是 class当你试图写一个 value type .值类型的一个很好的例子是 DateTime .不管发生什么,2013 年 1 月 12 日下午 3:33 GMT-7 总是会是 2013 年 1 月 12 日下午 3:33 GMT-7。颜色是另一个很好的例子;由 RGB 255, 0, 0 组成的两种颜色永远不会有任何不同。

您尝试创建的类型,Vehicle ,没有value semantics因为您希望它包含旨在为汽车的特定实例更新的状态。因此,您应该编写一个可变的 class而不是 struct .

关于C# 结构 : Mutability versus Performance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14298620/

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