我在一個類中有一個類的數組(Voxel)。我使用以下方法添加到數組中並從中移除。備忘錄模式用於存儲每種方法的操作,以便可以隨時撤消/重做。如何在包含數組的類的外部引用數組元素?
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
}
在一個單獨的I類希望有通過上述類保持體素的陣列中的特定體素的參考。
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值在數組更新時自動更新。
你在混淆。你的體素變量指向一個體素對象而不是數組槽。清除數組插槽對它指向的體素對象沒有任何作用。對於你所描述的你需要一個指向陣列插槽的對象(這是btw而不是Voxel)。你需要一個不同的設計來做到這一點 – Eddy