为什么在从类外部调用SetData()方法时,我在索引0而不是0xD0获取字节0x00?
这里缩短了班级:
using System;
namespace StackOverflow
{
class Section
{
uint _sectionId;
byte[] _sectionData;
public Section(byte[] sectionData) {
_sectionData = sectionData;
_sectionId = GetUShort(0x0FF4);
Console.WriteLine(_sectionId + ": " + _sectionData[0].ToString("X")); // Gives D0
}
public void SetData() {
switch (_sectionId) {
case 0: SetTrainerInfo(); break;
default: break;
}
}
void SetTrainerInfo() {
Console.WriteLine(_sectionId + ": " + _sectionData[0].ToString("X")); // Can Give 0
byte[] deByte = GetBytes(0x00, 7);
TrainerInfo.playerName = PkmString.GetString(deByte);
Console.WriteLine(TrainerInfo.playerName + "name here");
}
}
}
如果在Section构造函数中调用,则可以正常工作,但不能从这样的外部源中工作:
using System;
namespace StackOverflow
{
class SaveBlock
{
const short SECTIONS = 14, SECTION_SIZE = 4096;
public Section[] sections = new Section[SECTIONS];
public SaveBlock(byte[] blockData) {
byte[] sectionData = new byte[SECTION_SIZE];
for (int i = 0; i < SECTIONS; i++) {
Array.Copy(blockData, SECTION_SIZE * i, sectionData, 0, SECTION_SIZE);
sections[i] = new Section(sectionData);
}
}
public void SetForAll() {
foreach (Section sect in sections)
sect.SetData();
}
}
}
答案 0 :(得分:1)
从SaveBlock
构造函数中查看此代码:
byte[] sectionData = new byte[SECTION_SIZE];
for (int i = 0; i < SECTIONS; i++) {
Array.Copy(blockData, SECTION_SIZE * i, sectionData, 0, SECTION_SIZE);
sections[i] = new Section(sectionData);
}
循环将blockData
字节复制到sectionData
数组,然后使用sectionData
创建新的Section
对象实例。事情变得棘手...... 数组是引用类型。这意味着Section
构造函数中的以下行仅复制对数组的引用:
_sectionData = sectionData;
当您遍历循环时,您会反复将数据复制到同一个数组实例中,然后将同一个数组实例分配给多个Section
个对象的内部数据。所有这些对象都共享同一个数组实例!您很可能希望每个对象都有新数组:
byte[] sectionData;
for (int i = 0; i < SECTIONS; i++) {
sectionData = new byte[SECTION_SIZE];
Array.Copy(blockData, SECTION_SIZE * i, sectionData, 0, SECTION_SIZE);
sections[i] = new Section(sectionData);
}
这可能不是唯一的问题,因为_sectionId
被定义为私有,初始化为非0。 SetData()
方法如下所示:
public void SetData() {
switch (_sectionId) {
case 0: SetTrainerInfo(); break;
default: break;
}
}
从我们可以看到的代码中,_sectionId
无法成为0
,因此无法调用SetTrainerInfo()
。