Переменные обнуляются, когда я вызываю метод - PullRequest
0 голосов
/ 12 октября 2011

Я хочу, чтобы choice == 1 можно было выбирать только пять раз, поэтому я инициализировал переменную firstClass = 0, а затем настроил время для firstClass < 5. Я включил firstClass++ в свое задание, чтобы действовать в качестве счетчика. Однако я думаю, что firstClass переинициализируется каждый раз, когда я вызываю метод CheckIn(). Как я могу предотвратить это? Заранее спасибо.

using System;

namespace Assignment7
{
    class Plane
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Welcome to the Airline Reservation System.");
            Console.WriteLine("Where would you like to sit?\n");
            Console.WriteLine("Enter 1 for First Class.");
            Console.WriteLine("Enter 2 for Economy.");
            CheckIn();
        }

        public static void CheckIn()
        {
            int choice = Convert.ToInt32(Console.ReadLine());
            int firstClass = 0;
            int economy = 0;

            if (choice == 1)
            {
                do
                {
                    Console.WriteLine("You have chosen a First Class seat.");
                    firstClass++;
                    CheckIn();
                } while (firstClass < 5);
            }
            else if (choice == 2)
            {
                do
                {
                    Console.WriteLine("You have chosen an Economy seat.");
                    economy++;
                    CheckIn();
                } while (economy < 5);
            }
            else
            {
                Console.WriteLine("That does not compute.");
                CheckIn();
            }
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 12 октября 2011

Это совершенно нормально.Если вы хотите, чтобы переменная существовала вне метода, вы должны объявить вне метода, как "поле".Просто переместите:

int firstClass = 0;

за пределы метода, добавив модификатор static (в данном случае):

static int firstClass = 0;

Обратите внимание, что это само по себе не является потокобезопасным;если многопоточность является проблемой (например, ASP.NET), тогда используйте int newValue = Interlocked.Increment(ref firstClass);.Я упоминаю об этом только потому, что в общем случае static данные должны учитывать многопоточность, но я подозреваю, что это не проблема в вашем случае (exe консоли).

1 голос
/ 12 октября 2011

Переменная firstClass определяется методом.Каждый раз, когда метод вызывается, переменная переинициализируется.Чтобы firstClass стал постоянным счетчиком, он должен быть вне метода внутри класса.

0 голосов
/ 12 октября 2011

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

Например, вы можете сделать что-то вроде:

using System;

namespace Assignment7
{
    class Plane
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Welcome to the Airline Reservation System.");
            Console.WriteLine("Where would you like to sit?\n");
            Console.WriteLine("Enter 1 for First Class.");
            Console.WriteLine("Enter 2 for Economy.");
            CheckIn(0, 0);
        }

        public static void CheckIn(int firstClassSeatsTaken, int economySeatsTaken)
        {
            int choice = Convert.ToInt32(Console.ReadLine());

            if (choice == 1)
            {
                do
                {
                    Console.WriteLine("You have chosen a First Class seat.");
                    firstClass++;
                    CheckIn(firstClassSeatsTaken, economySeatsTaken);
                } while (firstClass < 5);
            }
            else if (choice == 2)
            {
                do
                {
                    Console.WriteLine("You have chosen an Economy seat.");
                    economy++;
                    CheckIn(firstClassSeatsTaken, economySeatsTaken);
                } while (economy < 5);
            }
            else
            {
                Console.WriteLine("That does not compute.");
                CheckIn(firstClassSeatsTaken, economySeatsTaken);
            }
        }
    }
}
...