Проблема с областью действия в функции, локальная переменная не определена

Я получаю сообщение об ошибке для dateClose.closing: «используется неназначенная локальная переменная». Я объявил dateClose вне цикла for и определил значение внутри цикла for. Как я могу сделать это значение доступным вне цикла for?

public class SMA
{
    public Models.DateClose SMAMethod (Queue<Models.DateClose> queue, int period)
    {
        decimal average, sum=0;
        Models.DateClose dateClose;
        for (int i = 0; i < period; i++)
        {
            dateClose = queue.Dequeue();
            sum += dateClose.Close;
        }
        average = sum/period;
        dateClose.Close = average;  <--- error

        return dateClose;

    }
}

Причина ошибки заключается в том, что переменная не была назначена (т.е. ей не присвоено значение, такое как «null» или «1»). Ответ Стива ниже исправит эту ошибку.

MikeH 12.11.2018 23:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

вы можете просто исправить ошибку, выполнив

Models.DateClose dateClose = null;

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

Стив, эта строка в цикле for "dateClose = queue.Dequeue ();" присваивает значение dateClose.close. Почему это неизвестно вне цикла for?

Jam66125 13.11.2018 10:57

@ Jam66125, потому что линия не гарантирует запуск (например, период = 0)

Steve 13.11.2018 16:29

Ты можешь это сделать. Если ваша переменная period больше, чем счетчик очереди, то dateClose.Close вызовет исключение.

public Models.DateClose SMAMethod (Queue<Models.DateClose> queue, int period)
{
    decimal average, sum=0;
    Models.DateClose dateClose = null;
    for (int i = 0; i < period; i++)
    {
        dateClose = queue.Dequeue();

        if (dateClose != null)
            sum += dateClose.Close;
    }

    average = sum/period;
    dateClose.Close = average;  

    return dateClose;

}

Почему вы получаете эту ошибку:

если у вас есть класс, переменные-члены инициализировать не нужно:

public class Test
{
    private int temp; // this is okay.

..
}

Однако, если у вас есть локальные переменные, вам необходимо их инициализировать:

public void Method()
{
int variabl; 

sum += variable; // error.
}

Итак, локальные переменные должны быть инициализированы, а переменные-члены - нет.

Другие вопросы по теме