C # логический внешний метод не будет читать - PullRequest
0 голосов
/ 20 января 2012

У меня есть вопрос, который может показаться очень странным, но я застрял на нем последние 3 дня. У меня есть метод ApplyRules, который используется очень часто, поэтому я не могу определить bool внутри него, но когда я пытаюсь определить его вне метода, он не читает его. Вот мой код:

public bool solvedp1 = false;

    public static void ApplyRules()
    {

        if (Level.Rooms[0, 0].GetItem("Red Gem") != null
            & Level.Rooms[1, 0].GetItem("Blue Gem") != null
            & solvedp1 == false)
        {
            Console.Clear();
            Console.WriteLine("You put the gem in its correct place. As soon as the gem is in position, you feel a shiver and a warm feeling enters your toes and passes through your whole body. The strange feeling in the room is gone. You hear a lock unlocking and a door shrieking as it opens..");
            Console.WriteLine("Press enter to continue");
            Console.ReadKey();
            solvedp1 = true;
        }

Ответы [ 5 ]

5 голосов
/ 20 января 2012

Метод статический, а логическое значение основано на экземплярах.Сделайте либо логическое статическое, либо метод нестатическим (возможно, измените логическое значение).

Поскольку статические методы не могут получить доступ к переменным на основе экземпляра, ваш метод технически не может «видеть» логическое значение, поскольку логическое значение связанос экземплярами вашего класса, а не вашего класса в целом.Если, скажем, классом является PuzzleSolver, то для каждого экземпляра PuzzleSolver существует логическое решениеolvedp1.Если когда-либо существует только 1 PuzzleSolver, тогда вы должны сделать resolp1 статическим логическим значением (технически это делает ваш класс Singleton, что может быть «плохо» в долгосрочной перспективе, но это скорее программа для обучения, чемдолгосрочный проект).

1 голос
/ 20 января 2012

Статические методы не могут получить доступ к переменным экземпляра.Однако, наоборот, методы экземпляра могут обращаться к статическим переменным.Вы можете видеть это следующим образом: переменные экземпляра создаются только тогда, когда вы явно объявляете экземпляр этого класса, но статические переменные создаются при первом обращении к нему.

1 голос
/ 20 января 2012

Ваша переменная является экземпляром переменной - т.е. каждый экземпляр вашего класса будет иметь отдельную переменную.

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

Непонятно, почему вы думаете, что не можете объявить переменную в методе только потому, что она «используется очень часто».Вы должны решить, какая переменная имеет смысл смысла , и действовать соответственно:

  • Локальная переменная подходит, когда естественное время жизни переменной является временем жизни методат.е. когда метод завершен, переменная не имеет значения.Он не должен сохраняться между вызовами методов и т. Д.

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

  • Статическая переменная подходит, когда она связана с самим типом, а не с каким-либо конкретным экземпляром типа.Статических переменных (кроме констант) очень часто следует избегать на том основании, что это своего рода «глобальное» состояние, о котором трудно рассуждать - это также затрудняет тестирование.

1 голос
/ 20 января 2012

Попробуйте это:

//Make this static so it is accessible to your ApplyRules() method.
public static bool solvedp1 = false;

public static void ApplyRules()
{
    if (Level.Rooms[0, 0].GetItem("Red Gem") != null
        & Level.Rooms[1, 0].GetItem("Blue Gem") != null
        & solvedp1 == false)
    {
        Console.Clear();
        Console.WriteLine("You put the gem in its correct place. As soon as the gem is in position, you feel a shiver and a warm feeling enters your toes and passes through your whole body. The strange feeling in the room is gone. You hear a lock unlocking and a door shrieking as it opens..");
        Console.WriteLine("Press enter to continue");
        Console.ReadKey();
        solvedp1 = true;
    }
}
0 голосов
/ 20 января 2012

Добавьте статическое ключевое слово в логическое значение.

...