【问题标题】:Cannot declare object in jagged array无法在锯齿状数组中声明对象
【发布时间】:2015-08-30 01:38:59
【问题描述】:

所以我正在尝试创建一个应用程序来计算您在一次地铁运输中花费的时间量,因此我创建了一个车站类,并以正常形式创建了一个包含三行的锯齿状数组(每行代表一个不同的地铁线)所以我像这样声明数组:station[][] lines = new station[3][];然后我像这样声明行

lines[0] = new station[34];
lines[1] = new station[19];
lines[2] = new station[35];

我在锯齿状数组中的对象内声明名称和值,如下所示:

lines[0][0].name = "stationname";
lines[0][0].number = 1;`

但是当我运行程序时,它给了我一个NullReferenceException, 我知道我没有正确声明对象(我认为),我不知道如何正确声明它们。 好吧,这里有一个更完整的代码示例:

        station[][] lines = new station[3][];
        lines[0] = new station[34];
        lines[0][0] = new station {name = "حلوان", number = 1 };
        lines[0][0].number = 1;
        lines[0][1].name = "عين حلوان";
        lines[0][1].number = 2;
        lines[0][2].name = "جامعة حلوان";
        lines[0][2].number = 3;
        lines[0][3].name = "وادى حوف";
        lines[0][3].number = 4;
        lines[0][4].name = "حدائق حلوان";
        lines[0][4].number = 5;

第二行

            lines[1] = new station[19];
        lines[1][0].name = "المنيب";
        lines[1][0].number = 36;
        lines[1][1].name = "ساقية مكى";
        lines[1][1].number = 37;
        lines[1][2].name = "ضواحى الجيزة";
        lines[1][2].number = 38;
        lines[1][3].name = "محطة الجيزة";
        lines[1][3].number = 39;
        lines[1][4].name = "فيصل";
        lines[1][4].number = 40;
        lines[1][5].name = "جامعة القاهرة";
        lines[1][5].number = 41;

第 3 行

            lines[2] = new station[35];
        lines[2][0].name = "مطار القاهرة";
        lines[2][0].number =54;
        lines[2][1].name = "السلام";
        lines[2][1].number = 55;
        lines[2][2].name = "عمر بن الخطاب";
        lines[2][2].number = 56;
        lines[2][3].name = "قباء";
        lines[2][3].number = 57;
        lines[2][4].name = "النزهة٢";
        lines[2][4].number = 58;
        lines[2][5].name = "النزهة١";
        lines[2][5].number = 59;

【问题讨论】:

  • 你能发布实际代码吗?同时显示错误在哪一行。
  • 当你声明一个锯齿状数组时,你首先将所有维度声明为一个新数组,但是你必须沿着第一个维度进行迭代,并为每个数组声明一个长度为 X 的新数组在那个维度。请记住,锯齿状数组是数组的数组。所以你“新建”数组数组,然后“新建”其中的每个数组。
  • 哦,但是如果 lines[0][0].name 指的是具有名为 .Name 的属性的 Class 或 Struct,那么您还必须初始化该 Class 或 Struct。这通常由构造函数完成,因此 . . .是的,请发布更多代码,以便我们可以看到那里发生了什么。
  • 实际上,当我启动程序时会发生错误,但是当我声明名称和数字时,它会在开始时给出 NullReferenceException ,我现在明白了,我应该“新建”首先然后声明名称和编号,虽然我有一百多行错误代码,如果有人知道如何快速编辑它们,请告诉我,我的整个团队都在开发这个程序,我正在减慢它们的速度下来:(
  • Visual Studio 具有出色的查找和替换功能。甚至正则表达式匹配(我不明白)。但是,例如,如果您可以突出显示顶部代码块中的“line [”并将其替换为“new line [”,它可能会起作用。没有看到具体的代码,我无法确定。

标签: c# arrays visual-studio visual-studio-2013


【解决方案1】:

您已经很好地初始化了数组,但您没有初始化其中的任何对象。

做:

lines[0][0] = new Station() { name = "...", number = 1 };

PS:我想你的意思是 Station 不是 station 对吧?

【讨论】:

  • station 是我制作的一个类,其中包含一个名为 name 的字符串和一个名为 number 的值,它的名称都是小写字母。 :)
  • @GamerGamesGames 不知道 C# 允许类名以小写字母开头。无论如何,您的课程应该以大写字母开头。
  • @MihaiBratulescu 允许。但它肯定不是典型的。
【解决方案2】:

我认为可能有些混乱。我试图捕捉我认为你的意思是什么。您想要一个行数组,并且在该数组中,每行包含一个站数组。每个站都有一个名称和编号。基于这种理解,这里有一些可以工作的代码,并给出了其余部分应该如何构建的想法。

    internal class Station
    {
        internal string name;
        internal int stationNumber;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Station[][] line = new Station[3][]; // Assuming 3 lines total

        line[0] = new Station[34]; // This is saying line #0 (stored in element major 0) needs 34 elements, each of which will contain a Station instance
        line [0][0] = new Station { "حلوان", 1 };
        line [0][1] = new Station {"عين حلوان", 2};
        line[0][2] = new Station {"جامعة حلوان",3};
        line[0][3] = new Station {"وادى حوف",4};
        line[0][4] = new Station { "حدائق حلوان", 5 };
    }

【讨论】:

  • 我希望这是有道理的。如果不查看整个程序,可能很难知道您需要什么,但我希望这能让您很好地了解您需要做些什么来防止出现错误。
  • 完全正确 :) ,为什么我使用锯齿状阵列是因为每条线路中有不同数量的站点,尽管有些站点相同但位于两条不同的线路中,对于那些我刚刚制作的站点例如:line[1][6] = helwan //(already declared object)
  • 嗯,这很奇怪。我在 VS2013 中编写了代码,但是当我在这里复制/粘贴时,它移动了引号。可能是软件在使用从右到左的字母时遇到问题。无论如何,我相信你知道我想发布什么,引号围绕字符串而不是数字,因为它在这里。
  • 是的,但它会是 EX : line[0][0] = new Station {name = "Station Name",number = (value)} :) 因为只是一个数字会给出一个错误:)
  • 是的,有点。但是,在括号内,您按照它们在类定义中出现的顺序给出值,但您不需要提供“name =”部分。你可以,但你不必这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 2023-03-03
  • 2013-11-07
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
相关资源
最近更新 更多