Проблемы при обнародовании переменной - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть некоторые проблемы с пониманием, когда переменная public и может быть доступна другим классам, а когда нет. Прямо сейчас я получаю сообщение об ошибке, что переменная run в Menu() не объявлена. Я пытался выставить «public» перед декларацией, но это просто дало мне массу ошибок. Как сделать объявление run в Main публичным?

public static void Main(string[] args)
{
    var run = 0;
    Menu();
}

static void Menu()
{
    run++;

    if (run <= 1) {
        Welcome();
    }
}

Я пытался найти решение, но не нашел, хотя кто-то наверняка спросил то же самое. Кстати, функции Main и Menu выглядят так, как будто их можно объединить, но предоставьте мне полезный обходной путь для другой части кода.

Ответы [ 4 ]

0 голосов
/ 03 ноября 2018

Есть множество ответов на вашу проблему. Но вам не хватает понимания Переменная и Область методов в Microsoft .NET .

Ниже приведен отрывок из указанной статьи (извините за ссылку на VB.Net, но она по-прежнему применима).

Область действия переменных - Вы можете объявить переменные в четырех разных местах ваших программ. От того, где вы решите объявить переменные, зависит объем.

  • Блок - Если вы объявляете переменную в конструкции блока, такой как оператор If, область действия этой переменной остается только до конца блока. Срок действия до окончания процедуры.

  • Процедура - Если вы объявляете переменную внутри процедуры, но вне какого-либо оператора If, область действия - до End Sub или End Function. Время жизни переменной до окончания процедур.

  • Модуль / Класс - Вы можете объявить переменную вне любой процедуры, но она должна быть в операторе Class…End Class или Module…End Module. Область действия - любая процедура в этом модуле. Время жизни переменной, определенной в классе, составляет, пока объект не будет очищен сборщиком мусора. Время жизни переменной, определенной в модуле, составляет до конца программы.

  • Project - Вы можете объявить переменную Public в операторе Module…End Module, и областью действия этой переменной будет любая процедура или метод в рамках проекта. Время жизни переменной будет оставаться до завершения программы.
0 голосов
/ 03 ноября 2018

run будет объявлено как собственность вашего класса:

class YourClass
{
    public static int run = 0;

    public static void Main(string[] args)
    {
        Menu();
    }

    static void Menu()
    {
        run++;
        if (run <= 1) {
            Welcome();
        }
     }
 }
0 голосов
/ 03 ноября 2018

Переменные, не входящие в их область, недоступны. Это означает вне блока (внутри фигурных скобок), где они определены (чтобы было проще). Таким образом, вы можете получить доступ к run только в таких субблоках, как это:

public static void Main(string[] args)
{
    var run = 0;
    {
        run++;
        if (run <= 1) {
            Welcome();
    }
}

Другой способ - сделать переменную частью класса - тогда она станет полем, которое обычно является приватным:

public class Program 
{
    private static int run;
    public static void Main(string[] args)
    {
        run = 0;
        Menu();
    }

    static void Menu()
    {
        run++;

        if (run <= 1) {
            Welcome();
        }
    }
}

Если вы хотите заниматься объектно-ориентированным программированием, вы можете инкапсулировать это в класс:

public class Program 
{
    public static void Main(string[] args)
    {
        var myClass = new MyClass();
        myClass.Run = 0;
        myClass.Menu();
    }
}

public class MyClass
{
    public int Run { get; set; }

    public void Menu()
    {
        Run++;

        if (Run <= 1) {
            Welcome();
        }
    }
}
0 голосов
/ 03 ноября 2018

Вы не можете сделать все переменные public, как локальная переменная run в вашем примере. Модификаторы доступа применяются только к переменным класса (так называемые поля ), которые объявлены вне метода:

public class Test 
{
    public static int run = 0;

    public static void Main(string[] args)
    {

        Menu();
    }

    static void Menu()
    {
        run++;

        if (run <= 1) {
            Welcome();
        }
    }
}
...