当我在 form_load 中制作一个点矩阵时它可以工作,但是当我在一个单独的 class 中制作它并在 form_load 中制作它的对象时它不起作用

When I make a matrix of points in form_load it works, but when i make it in a separate class, and make an object of it in form_load it doesn`t work

所以我需要制作一个点矩阵来将按钮分布在一个区域上,我想制作一个具有矩阵本身的 class 因为按钮不会一直出现在屏幕上,它们会移动在网格等

无论如何,下面是 class 的构造函数的作用:


 public Table()
        {

            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {

                    _Grid[i, j] = new Point(i * 90, j * 90);


                }
            }
        }

90 是按钮的宽度

然后我有一个 属性 允许获取网格:


 public Point[,] Grid
            {
            get;
            }

然后我这样 form_load:


 private void Form1_Load(object sender, EventArgs e)
        {
            Table tab = new Table();
            Point[,] grid = tab.Grid;

            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {

                    Button btn =  new Button();
                    btn.Width = 88;
                    btn.Height = 88;
                    btn.Location = grid[i, j]; // it returns a NullReferernceException here
                    panel1.Controls.Add(btn);

                }
            }   
        }

添加位置给了我一个空引用,但是如果我从构造函数复制代码并在 form_load 中制作网格矩阵,它就可以工作。(按钮宽度和高度是 88,所以有一个按钮之间的漂亮小 space)

我显然还在学习,你可以看到我卡在了这个项目的最开始,因为我什至不能让所有的按钮都出现在它们应该出现的地方。

这是一个猜测,但我怀疑你在 Table

中做过类似的事情
private Point[,] _Grid = new blahblahblah
public Point[,] Grid
        {
        get;
        }

这两个东西在内存中引用的不是同一个东西 - 你已经填充了 _Grid 并且它是有效的对象,但是 属性 Grid 引用了一些不可见的后备存储编译器创建的变量;有一个相似的名字不足以将它们连接在一起

  • 将 Table 更改为:
    public Point[,] Grid { get; } = new blahblahblah
  • 删除任何提及 _Grid 以支持 Grid

  • 更改构造函数,使其通过 属性 设置数组(从而将值写入编译器创建的不可见支持字段):

    Grid[i, j] = new Point(i * 90, j * 90);

然后检索 tab.Grid 将检索非空的已填充内容


脚注,我们将私有成员命名为 _camelCase,而不是 _PascalCase,如果您想显式声明一个只读的 属性 以获取 class 成员字段,它看起来像:

private Point[,] _grid = blahblahblah;
public Point[,] Grid { get { return _grid; }}

或:

private Point[,] _grid = blahblahblah;
public Point[,] Grid { get => _grid; }

即您必须通过让 prop 去并按名称获取该字段来将它们具体连接在一起,然后 return it

我们可以再次进入“属性不应该 return 数组”:D