【问题标题】:Using a Person class in an array在数组中使用 Person 类
【发布时间】:2014-12-14 11:21:47
【问题描述】:

您好,我有以下问题:

我正在创建一个包含 Person 对象数组的程序。

aantalpersonen = int.Parse(tbArray.Text); // aantal te creëren items in array;

if (aantalpersonen > 5 || aantalpersonen <= 1)
    throw new ArgumentOutOfRangeException();
else
{
    Persoon[] personenLijst = new Persoon[aantalpersonen];
    foreach (Persoon persoon in personenLijst)
    {
         Persoon pers1 = new Persoon();
    }
}

在调试中观察这个给了我 = 一个包含用户定义人数的新数组, 一个包含人数的整数。在其他一些代码行中,我得到一个整数,其中包含当前选择(要编辑)的人。 这一切都很好,但是当我尝试将数据添加到每个人的属性时,我遇到了问题。

private void btnUpdateData_Click(object sender, RoutedEventArgs e)
{
    personenLijst[huidigpersoon - 1].Naam = tbNaam.Text;
    personenLijst[huidigpersoon - 1].Gewicht = int.Parse(tbGewicht.Text);
    personenLijst[huidigpersoon - 1].Lengte = int.Parse(tbLengte.Text);
    personenLijst[huidigpersoon - 1].Geboortedatum = dpGeboorte.SelectedDate.GetValueOrDefault(DateTime.Today);
}

这给了我以下错误:

System.NullReferenceException 未处理 H结果=-2147467261 Message=对象引用未设置为对象的实例。

我的第一个问题是我必须使用用户选择的人数来明确声明每个人。但我无法弄清楚我应该如何做到这一点,即使我能做到,我怎样才能确保 personclass 的每个实例都有不同的名称,例如 persoon1 ,persoon2 ..

【问题讨论】:

  • (Persoon persoon inpers1 之间没有关系。你没有填充数组。此外,personenLijst 的范围为 else 块。

标签: c# arrays


【解决方案1】:

您已声明该数组包含指定数量的 Persoon 对象,但您尚未将数组的任何元素设置为实际的 Persoon 实例。
所以你不能使用不存在的东西

aantalpersonen = int.Parse(tbArray.Text); 

if (aantalpersonen > 5 || aantalpersonen <= 1)
    throw new ArgumentOutOfRangeException();
else
{
    Persoon[] personenLijst = new Persoon[aantalpersonen];
    for( int x = 0; x < personenLijst.Length ; x++)
    {
       personenLijst[x] = new Persoon();
    }
 }

之后,您的数组将填充 Persoon 类的实例,您可以更改各个实例的属性。但是,正如 Holterman 先生在下面的评论中所指出的,该数组在此代码的 sn-p 中被声明为局部变量,因此它在您尝试更改各个属性的事件处理程序中不可用(不在范围内) .要解决这个问题,应该在全局级别声明数组。

 Persoon[] personenLijst = null;

并用

初始化
 personenLijst = new Persoon[aantalpersonen];

说了这么多,为什么还要用数组而不是更通用的List&lt;Persoon&gt;

【讨论】:

  • 注意personenLijst 的(无用)范围。这并不能解决所有问题。
  • @HenkHolterman 是的,你是对的,没有想过,我会将你的评论添加到答案中。
  • 嗨,在此先感谢,我得到了图片,并且我的数组已经在代码上方进行了初始化,以使其在任何地方都能正常工作。问题是将我的代码更改为上面的代码,所以填满它们,仍然给我同样的错误。在调试模式下并设置断点后,我可以看到 prog 一切正常,直到达到需要填写 objectproperty 的点: personenLijst[huidigpersoon - 1].Naam = tbNaam.Text;给出我在问题中所说的相同错误
  • 哦,对不起,我看到其他事情发生了,通过使用循环,它开始填充类中要求数量的 Persoon 对象,所以它们都可以使用了,而不是当我使用更新时按钮一切都再次重置为null..我认为问题再次与范围相关。
  • @Jelman Holtermann 先生的评论已经清楚地概述了这个问题,我已经向您展示了如何解决它。如果你仔细看我的回答你会注意到初始化不包含数组的声明。
【解决方案2】:

你的问题来自于你没有初始化你的数组成员。

您创建了一堆“Person”,但它们没有存储到您的数组中。正如 .NET 所述,默认情况下,数组初始化为所有列设置为null

你的代码应该是:

Persoon[] personenLijst = new Persoon[aantalpersonen];
int i = 0;    
   foreach (Persoon persoon in personenLijst)
     {
       personenLijst[i] = new Persoon();
       i++;
     }

【讨论】:

    【解决方案3】:

    好的,谢谢,问题是我这样做了:Persoon[] personenLijst = new Persoon[aantalpersonen];在 else 循环之后,它在全局级别声明的第一个 i 旁边创建了一个 NEW 数组

    改为 personenLijst = new Persoon[aantalpersonen];一切正常! 谢谢你们的帮助! 欣赏它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2021-03-08
      • 1970-01-01
      • 2017-08-17
      • 2011-11-23
      相关资源
      最近更新 更多