我在一个类中有一组类(体素)。我使用以下方法在数组中添加和删除。备忘录模式用于存储每个方法的操作,以便可以在任何时候撤消/重做。
public void AddVoxel(int x, int y, int z)
{
int index = z * width * height + y * width + x;
frames[currentFrame].Voxels[index] = new Voxel();
// Undo/Redo history
undoRedoHistories[currentFrame].Do(new AddMemento(index));
}
public void RemoveVoxel(int x, int y, int z)
{
int index = z * width * height + y * width + x;
// Undo/Redo history
undoRedoHistories[currentFrame].Do(new RemoveMemento(index, frames[currentFrame].Voxels[index]));
frames[currentFrame].Voxels[index] = null; // Does not update 'voxelSelected' reference
}
在一个单独的类中,我希望引用上述类所持有的体素数组中的特定体素。
private Voxel voxelSelected = null;
作为引用类型,我希望这个值能够自动知道它“指向”的数组部分何时包含体素或为空。这在使用撤消命令时很重要,因为体素可以从数组中删除并变为空,反之亦然。
要从数组中获取体素,我使用以下方法。
public Voxel GetVoxel(int x, int y, int z)
{
return frames[currentFrame].Voxels[z * width * height + y * width + x];
}
然后我如下设置对体素的引用。
public void SetVoxelSelected(ref Voxel voxel)
{
voxelSelected = voxel;
}
voxelMeshEditor.AddVoxel(0, 0, 0);
var voxel = voxelMeshEditor.GetVoxel(0, 0, 0); // Copies rather than references?
SetVoxelSelected(ref voxel);
Console.WriteLine(voxelSelected == null); // False
voxelMeshEditor.RemoveVoxel(0, 0, 0);
Console.WriteLine(voxelSelected == null); // False (Incorrect intended behaviour)
如何正确引用数组中的体素,以便在数组更新时 voxelSelected 值自动更新。