NullReferenceException по свойству массива объекта

У меня есть класс, реализованный как это:

class Person
{
    public int ID { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
    public double[] Fees { get; set; }  

    public Person() { }

    public Person(
        int iD,
        string fName,
        string lName,
        double[] fees)
    {
        ID = iD;
        FName = fName;
        LName = lName;
        Fees = fees;
    }
}

Затем я пытаюсь проверить код в простом событии нажатия кнопки, например:

Person p = new Person();
p.ID = 1;
p.FName = "Bob";
p.LName = "Smith";
p.Fees[0] = 11;
p.Fees[1] = 12;
p.Fees[2] = 13;

for (int i = 0; i < p.Fees.Length; i++)
{
    lstResult.Items.Add(p.ID + ", " + p.FName + ", " + p.LName + ", " + p.Fees[i]);
}

На данный момент я держу все очень просто и просто, чтобы получить то, что мне нужно.

Visual Studio выдает эту ошибку при запуске программы:

NullReferenceException was unhandled

Ошибка связана со свойством массива Fees объекта Person. Мне нужно иметь массив в качестве свойства объекта, чтобы я мог связать сборы с конкретным человеком. Поэтому, если то, что я пытаюсь сделать здесь, невозможно, я бы хотел сохранить то же самое в классе.

  • Я правильно не создаю объект?
  • Нужно ли делать что-то еще для инициализации свойства массива?
  • Кто-нибудь может увидеть проблему, с которой я столкнулся?

Я готов поделиться идеями об использовании словаря или какой-либо другой структуры данных. но ТОЛЬКО если то, что я пытаюсь сделать здесь, абсолютно НЕ возможно.

Я посмотрел вокруг в Google и не повезло. Я посмотрел старые заметки класса и примеры проектов, и не повезло. Это моя последняя надежда. Кто-нибудь, пожалуйста, помогите. Спасибо всем заранее.

5 ответов

Решение

Вы пропускаете инициализацию массива, как указали другие.

p.Fees = new double[3];

Но универсальный список будет лучше подходить почти для всех мест, где вы будете использовать массив. Это все та же структура данных.

Список будет автоматически уменьшаться и расширяться при добавлении и удалении элементов в нем, что устраняет необходимость самостоятельно управлять размером массива.

Рассмотрим этот класс (обратите внимание, что вам нужно импортировать System.Collections.Generic)

    using System.Collections.Generic;

    class Person
    {
    public int ID { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
    public List<double> Fees { get; set; }

    public Person() 
    { }

    public Person(
        int iD,
        string fName,
        string lName,
        List<double> fees)
    {
        ID = iD;
        FName = fName;
        LName = lName;
        Fees = fees;
    }
}

Теперь вот как должен выглядеть ваш метод испытаний

        Person p = new Person();
        p.ID = 1;
        p.FName = "Bob";
        p.LName = "Smith";
        p.Fees = new List<double>();
        p.Fees.Add(11);
        p.Fees.Add(12);
        p.Fees.Add(13);

        for (int i = 0; i < p.Fees.Count; i++)
        {
            lstResult.Items.Add(p.ID + ", " + p.FName + ", " + p.LName + ", " + p.Fees[i]);
        }

Вам все еще нужно будет создать новый экземпляр свойства Fees, но вам не нужно беспокоиться об инициализации размера массива сейчас. Для бонусных баллов вы можете легко преобразовать его в массив, если вам нужно, используя ToArray()

p.Fees.ToArray();

Вам нужно инициализировать сборы. например

Person p = new Person();
p.ID = 1;
p.FName = "Bob";
p.LName = "Smith";
p.Fees = new double[] {11, 12, 13};

Добавить следующую строку

p.Fees = new double[3];

до

p.Fees[0] = 11;

Это

Person p = new Person();
p.ID = 1;
p.FName = "Bob";
p.LName = "Smith";
p.Fees[0] = 11;
p.Fees[1] = 12;
p.Fees[2] = 13;

следует перевести на это

Person p = new Person(1,"Bob","Smith",new double[]{ 11, 12, 13 });

В вашем конструкторе по умолчанию, который вы вызываете, вы не инициализируете fees,

public Person() {
  this.Fees = new double[10]; // whatever size you want
}
Другие вопросы по тегам