gpt4 book ai didi

C# 最佳实践 : Editable state is a reference so still connected

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:51 24 4
gpt4 key购买 nike

我有一个 CameraComponent 类。它包含一个名为 CameraState 的类。一个简化的例子:

public class CameraState
{
public float zoom = 1f;
// a number of other fields, some value types, some reference types...
}

public class CameraGameComponent
{
private CameraState currentCameraState = new CameraState();

public CameraState CurrentCameraState
{
get { return currentCameraState; }
set { currentCameraState = value; }
}
//...

想法是另一个类可以创建一个新的 CameraState,对其进行设置,然后设置 CurrentCameraState 以使相机使用该新状态。这很好用。

或者,其他类可以获取 CurrentCameraState,存储它或根据需要更改它(此时代码的其他部分可能会更改 CurrentCameraState),然后设置 CurrentCameraState 以使相机使用存储的状态。

问题在于,当其他类读取 CurrentCameraState 然后更改其状态版本时,相机中的状态也会更改。例如:

// in another class
// Camera.CurrentCameraState.zoom is currently 1f
CameraState state = Camera.CurrentCameraState;
state.zoom = 20f; // line 1
CameraState testState = Camera.CurrentCameraState;
float testzoom = testState.zoom; // line 2
// at this point testzoom is 20f, not 1f

我希望第 1 行中缩放的更改不会影响 Camera.CurrentCameraState 中的缩放值,因此在第 2 行 testzoom 的值为 1f。

类似地,如果

// in another class, class 1
// Camera.CurrentCameraState.zoom is currently 1f
CameraState state = Camera.CurrentCameraState;

[...]

// elsewhere, in yet another class, class 2
Camera.CurrentCameraState.zoom = 20f;

[...]

// at a later point in class 1
float testzoom = state.zoom; // line 3
// at this point testzoom is 20f, not 1f

我希望第 3 行的 testzoom 是存储时的状态,即 1f。

我知道为什么会发生这种情况(CurrentCameraState 返回一个引用),我可以想出很多方法来阻止它发生(返回 CameraState 类的新深拷贝,使用结构,获取 Camera 类来处理存储和恢复状态等),但我的问题是:

对于这种用法,实现此目的的最佳实践方法是什么?我是否遗漏了一些明显的东西?

最佳答案

听起来你只想CameraState成为一个值类型(结构)。如果您希望 CameraState 的所有实例都具有此行为,而不仅仅是 CameraGameComponent 中的那些,然后只使用一个结构。

如果需要CameraStateCameraGameComponent 内与 CameraState 的所有其他实例的行为不同, 那么您需要更改 CurrentCameraState 的行为属性(property)。 getter 必须返回 CameraState 的副本,并且 setter 必须设置属性:

public class CameraGameComponent
{
private CameraState currentCameraState = new CameraState();

public CameraState CurrentCameraState
{
get {
var cs = new CameraState{};
cs.zoom = currentCameraState.zoom;
return cs;
}
set {
currentCameraState.zoom = value.zoom;
}
}
}

关于C# 最佳实践 : Editable state is a reference so still connected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27869140/

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