2014-10-13 6 views
0

Я создал простой калькулятор с помощью VS 2013 Pro ... и вот сегмент кодов:Где объявлять переменные в C#

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace CalcTwo 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

    } 


    string input = string.Empty; 
    double numb1, numb2, result; 


    private void button1_Click(object sender, EventArgs e) 
    { 
     double.TryParse(textBox1.Text, out numb1); 
     double.TryParse(textBox2.Text, out numb2); 
     result = numb1 + numb2; 
     textBox3.Text = result.ToString(); 
    } 

    private void button4_Click(object sender, EventArgs e) 
    { 
     double.TryParse(textBox1.Text, out numb1); 
     double.TryParse(textBox2.Text, out numb2); 
     result = numb1 - numb2; 
     textBox3.Text = result.ToString(); 
    } 
} 
} 

теперь проблема я столкнулся, я имею получил еще две кнопки для умножения и деления, что в свою очередь заставляет меня скопировать пасту double.TryParse(textBox1.Text, out numb1); double.TryParse(textBox2.Text, out numb2);

для каждой кнопки. Я пытался поставить коды с другими переменными (двойной NUMB1, numb2, результат), но получаю сообщение об ошибке ... Вот скриншоты

enter image description here

Here is the error message

Довольно новый для Visual Studio и C#. Помощь приветствуется! :)

+1

Сообщения об ошибках важны. –

+0

Что делает ошибка –

+0

Что касается использования 'TryParse'. Что вы собираетесь делать, если он не выполняет синтаксический анализ строки? –

ответ

4

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

private void CaptureValues() 
{ 
    double.TryParse(textBox1.Text, out numb1); 
    double.TryParse(textBox2.Text, out numb2); 
} 

Затем в обработчиках:

private void button1_Click(object sender, EventArgs e) 
{ 
    CaptureValues(); 
    result = numb1 + numb2; 
    textBox3.Text = result.ToString(); 
} 

Это дает вам удобное место для дополнительного кода. Проверка входов и отображение сообщения, например:

private void CaptureValues() 
{ 
    if (!double.TryParse(textBox1.Text, out numb1)) 
     // textBox1 couldn't be parsed, show an error message 
    if (!double.TryParse(textBox2.Text, out numb2)) 
     // textBox2 couldn't be parsed, show an error message 
} 

Можно даже пойти дальше и поставить значения в свойства на уровне класса. Что-то вроде этого:

private double Value1 
{ 
    get 
    { 
     double result; 
     if (!double.TryParse(textBox1.Text, out result)) 
      throw new Exception("Couldn't parse the first text box!"); 
     return result; 
    } 
} 

private double Value2 
{ 
    get 
    { 
     double result; 
     if (!double.TryParse(textBox2.Text, out result)) 
      throw new Exception("Couldn't parse the second text box!"); 
     return result; 
    } 
} 

С теми, вам не нужны ваши numb1 или numb2 переменные вообще, просто ссылаться на свойства непосредственно:

textBox3.Text = (Value1 + Value2).ToString(); 

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

try 
{ 
    textBox3.Text = (Value1 + Value2).ToString(); 
} 
catch (Exception ex) 
{ 
    // examine what happened with ex and show an error 
} 

Вы можете бросить более конкретный тип Exception конечно, даже пользовательский. Или вы можете ответить на ошибку в свойствах вместо обработчиков и вообще не использовать исключения. (Есть аргумент, который нужно сделать, и я согласен с ним, никогда не использовать исключения для нормальной логики, и это потенциально один из этих случаев краев. Если это нормальная логика, не используйте исключения. Если это исключительный случай а значение не должно никогда быть не-распознаваемо, идти вперед и использовать их. Я бы предпочитает не в этом случае, но только при добавлении его как возможность.)

Есть много вариантов ,

+0

Whoa .... @David Вы разбили его помощником! хорошо, используя этот простой метод, предпочтительнее для меня, но он все равно заставляет меня называть его в каждой кнопке ... Я просто пытаюсь выяснить, где объявить эти переменные .. или если я объявляю их неправильными – envyM6

+0

@ envyM6: Объявлять вещи на уровне класса, кажется, путь сюда для ваших нужд. Единственное, что вы делали неправильно, - это попытаться вызвать логику * на уровне класса, которая должна произойти внутри метода или свойства. Инкапсуляция значений свойств является, как правило, решением этой проблемы. – David

+0

Ага ... Большое спасибо! поэтому в основном 'double.TryParse (textBox1.Text, out numb1); double.TryParse (textBox2.Text, out numb2); '' 'Logic' не' Variables' и, следовательно, не может быть выполнен на уровне класса ... Правильно ли я понял? – envyM6

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