Null Reference - массив остается пустым - PullRequest
0 голосов
/ 03 февраля 2012

Я новичок в программировании и у меня следующая проблема.У меня есть класс с массивом.Однако я знаю только, какой размер будет иметь массив на более позднем этапе.

public class MyData
{
public double[] rad;
public void Integrate(int h_start, int h_stop, double dla_tar)
    {
    rad = new double[Math.Abs(h_stop - h_start)];
    ...fill up the rad array
    }
--work with rad here--
}

Как получить функцию Integrate для создания массива rad в классе MyData.Как то, что всегда остается нулевым.Это, наверное, очень тупой вопрос ...

1 Ответ

1 голос
/ 03 февраля 2012

Ключ должен позвонить Integrate перед использованием rad. До тех пор, пока вы не используете rad, пока не инициализируете его, все будет в порядке.

Любое поле в классе C # автоматически начинается со значения по умолчанию для этого типа, которое равно 0 для числового типа (int, uint, long и т. Д.), false для bool и null для любого ссылочного типа, включая массивы. Канонический способ решения этой проблемы - инициализация данных из конструктора. Так что вы могли бы сделать что-то вроде

public class MyData
{
    public double[] rad
    {
        get;
        private set;
    }

    public MyData(int start, int stop, double tar)
    {
        rad = new double[Math.Abs(start - stop)];
        // More code here
    }
    // No need for an integrate method now - the work is done in the constructor
}

Таким образом, невозможно использовать rad до его инициализации.

Если вы обнаружите, что перенос кода инициализации в конструктор не имеет смысла, вам, вероятно, нужно выполнить рефакторинг на два класса, чтобы у каждого класса было одно задание.

...