2016-03-08 2 views
2

Я изучаю C#. (6 часов). Мне больше нравится Ruby и Javascript, и я нахожу C# забавой, но все же более тусклым в том, что он позволит вам сделать, поэтому я заново открываю простые функции. Я пытаюсь построить простой калькулятор, чтобы перейти на C#, чтобы делать что-то, и я постоянно сталкиваюсь с проблемами области.Проблема, связанная с целыми числами внутри функции, которая будет передана позже - проблема с областью - я думаю

Вот код. Функция NumSelect разбивает ее. Я хочу, чтобы пользователь мог ввести 2 номера в консоли, а затем они будут добавлены. Как только это будет выполнено, я создам другие математические операции и добавлю логику, чтобы пользователь выбрал операцию, которую они хотели бы сделать, а затем спросить их о своих входах и затем выполнить расчет.

Ошибка

calculator.cs(18,9): error CS0103: The name `number1' does not exist in the current context 

и удар его на самом экземпляре number1 и number2 за пределами функции NumSelector. Таким образом, это похоже на проблему с областью, но я не могу понять правильный подход для назначения этих переменных в функции, поэтому мне нужно сделать это только один раз.

using System; 

class SimpleMath 
{ 
    public int Add(int number1, int number2) 
    { 
     int result = number1 + number2; 
     return result; 
    } 
    public int Subtract(int number1, int number2) 
    { 
     int result = number1 - number2; 
     return result; 
    } 
    //this function will assign the inputs to variables 
    public int NumSelect() 
    { 
     number1 = Console.ReadLine; 
     number2 = Console.ReadLine; 
    } 
    static void Main() 
    { 
     SimpleMath operation = new SimpleMath(); 

     Console.WriteLine("Give me two numbers and I will add them"); 
     operation.NumSelect(); 
     int result = operation.Add(number1, number2); 
     Console.WriteLine("{0} + {1} = {2}", number1, number2, result); 

    } 
} 

ответ

2

Ну вы должны решить, являются ли эти цифры означает быть частью состояния вашего объекта или нет. Если они есть, сделайте их полями. Если это не так, не надо. В этом случае, я бы, вероятно, держать их как локальные переменные и изменять код NumSelect просто вернуть один номер, введенный пользователем - и назвать его дважды:

public int NumSelect() 
{ 
    string line = Console.ReadLine(); 
    return int.Parse(line); 
} 

static void Main() 
{ 
    SimpleMath operation = new SimpleMath(); 

    Console.WriteLine("Give me two numbers and I will add them"); 
    int number1 = operation.NumSelect(); 
    int number2 = operation.NumSelect(); 
    int result = operation.Add(number1, number2); 
    Console.WriteLine("{0} + {1} = {2}", number1, number2, result); 
} 

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

class SimpleMath 
{ 
    private int number1; 
    private int number2; 

    public int Add() 
    { 
     int result = number1 + number2; 
     return result; 
    } 

    public int Subtract() 
    { 
     int result = number1 - number2; 
     return result; 
    } 

    public int SelectNumbers() 
    { 
     number1 = int.Parse(Console.ReadLine()); 
     number2 = int.Parse(Console.ReadLine()); 
    } 

    static void Main() 
    { 
     SimpleMath operation = new SimpleMath(); 

     Console.WriteLine("Give me two numbers and I will add them"); 
     operation.NumSelect(); 
     int result = operation.Add(); 
     Console.WriteLine(
      "{0} + {1} = {2}", 
      operation.number1, 
      operation.number2, 
      result); 
    } 
} 

Это не чувствовать себя как лучший подход ко мне - я бы ранее подход использования локальных переменных в Main - но я хотел показать вам альтернативу. Обратите внимание, что вы можете получить доступ только к operation.number1 в Main, потому что метод Main тот же тип, что вы должны поднять предупредительные сигналы.

+0

Какой смысл брать строку в виде строки? Почему бы просто не сделать int input = Console.ReadLine(); обратный вход; Я бы предположил, что вы разбираете строку, чтобы обрабатывать неудовлетворительный вход пользователей, который не является целым числом? Спасибо! – nwimmer123

+0

@ nwimmer123: Вы попробовали? Что такое объявленный тип возврата 'Console.ReadLine()'? Есть ли неявное преобразование из этого в 'int'? –

+0

Интересно. По-видимому, все ReadLines являются строками. Таким образом, вы не можете сохранить его как целочисленную назначаемую переменную и должны изменить свой тип данных, чтобы сделать это. Псих. Жесткость C# требует некоторого привыкания после ослабления Ruby. – nwimmer123

1

Поместите свои два номера как class поля, а не методы.

int number1 = 0, number2 = 0; //have them as class fields like this 
public int NumSelect() 
{ 
    number1 = Console.ReadLine(); 
    number2 = Console.ReadLine(); 
} 

Таким образом, вы можете получить доступ к вашей number1 и number2 по различным методам.

поля метода/рассуждения справедливы только в метод:

//number1 and number2 are method arguments, only accessible in the method 
public int Add(int number1, int number2) 
{ 
    int result = number1 + number2; 
    return result; 
} 

//not accessible elsewhere 
public int NumSelect() //number1 and number2 are unknown in this method 
{ 
    number1 = Console.ReadLine(); 
    number2 = Console.ReadLine(); 
} 
+0

Ahh, я думал, что если вы сделаете этот метод общедоступным, все переменные также станут общедоступными и, следовательно, будут видны классу. Благодаря! – nwimmer123

1

Просто сделайте два простых ввода от пользователя в Main(). Как:

number1 = int.Parse(Console.ReadLine()); 

number2 = int.Parse(Console.ReadLine()); 

А затем отправить его в свой метод, как:

int result = operation.Add(number1, number2); 

иначе объявить переменные в поле, так что вы можете использовать их в любом месте в классе.

Смежные вопросы