整数保持为0,即使它表示不是

use*_*877 0 c# int struct

我正在为我的游戏创建一个关卡设计师,你可以在用户控件上绘制平铺.为了跟踪瓷砖,我做了一个int []:

public int[,] Tiles = new int[35, 35];
Run Code Online (Sandbox Code Playgroud)

因为编辑屏幕是560px乘560px,35个16x16块.Tiles [x,y] .Id将给出tile的id.

Id将是图块的ID.无论何时放置瓷砖,都会在空白处记录:

public void Draw(int x, int y, int bid)
{
    //draw code here
    Program.form.Tiles[x, y].Id = bid;
}
Run Code Online (Sandbox Code Playgroud)

无论何时单击,都会调用void:

//In the MouseClick void:
Draw(e.X / 16, e.Y / 16, 1);
Run Code Online (Sandbox Code Playgroud)

0是可用的块ID,但例如使用1.

每当我去保存它,(我保存到.txt文件)它应该写下tile的id:

for (int x = 0; x < 35; x++)
{
    for (int y = 0; y < 35; y++)
    {
        //Write code here
        MessageBox.Show(Tiles[x, y].Id.ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

我只是让它在消息框中显示Id来查看,并且它总是给出'0',即使你在某个x,y tile上编辑了一个definatley不是0的blockid.有谁知道这是为什么?谢谢.顺便说一句,在'Program'类中,在STAThread之上,我把:

public Form1 form;
Run Code Online (Sandbox Code Playgroud)

然后:

form = new Form1();
Application.Run(form);
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

这是因为Tilea struct- 值类型.因此,

Program.form.Tiles[x, y]
Run Code Online (Sandbox Code Playgroud)

给你一份副本.您分配Id该副本,而Tile数组内的原始内容保持不变.这个例子说明了为什么在处理数组或集合中的值类型时应该非常小心.

您可以通过更改为Tile来解决此问题class.请注意,与struct始终具有默认值的值类型数组不同,class需要手动初始化引用对象数组的元素,以避免"对象引用未设置为对象的实例".错误:

for (int x = 0; x < 35; x++) {
    for (int y = 0; y < 35; y++) {
        Tiles[x, y] = new Tile();
    }
}
Run Code Online (Sandbox Code Playgroud)