2014-01-03 3 views
0

Привет, я новичок в C# и WPF, и мне было интересно, может ли кто-нибудь помочь мне с проблемой, с которой я в настоящее время сталкиваюсь. Я пытаюсь перегрузить 3 метода в очень простое и основное приложение wpf (просто посмотреть, как это работает), но во время выполнения, когда я пытаюсь проверить один или два варианта отчетов приложений и ошибок и закрывается. Однако, если я проверяю вариант 3, приложение работает по назначению. Любой, у кого есть подсказки или решения, будет отличным. (Вот фрагмент кода моего основного приложения).Методы перегрузки в WPF C#

{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void calculate_Click(object sender, RoutedEventArgs e) 
    { 
     int val = int.Parse(first.Text); 
     int val1 = int.Parse(second.Text); 
     int val2 = int.Parse(third.Text); 

     if ((bool)oneValue.IsChecked) 
      showTotal(val); 
     else if ((bool)twoValues.IsChecked) 
      showTotal(val, val1); 
     else if ((bool)threeValues.IsChecked) 
      showTotal(val, val1, val2); 
    } 

     private void showTotal(int val, int val1, int val2) 
    { 
     val = int.Parse(first.Text); 
     val1 = int.Parse(second.Text); 
     val2 = int.Parse(third.Text); 

     int total = val + val1 + val2; 
     result.Text = total.ToString(); 
    } 

    private void showTotal(int val, int val1) 
    { 
     val = int.Parse(first.Text); 
     val1 = int.Parse(second.Text); 
     int total = val + val1; 
     result.Text = total.ToString(); 
    } 

    private void showTotal(int val) 
    { 
     val = int.Parse(first.Text); 
     result.Text = val.ToString(); 
    } 

    private void quit_Click(object sender, RoutedEventArgs e) 
    { 
     this.Close(); 
    } 
} 
+3

Что такое ошибка? – JohnD

+7

Почему вы анализируете значения, передавая их в метод, а затем игнорируете эти значения и повторно разбираете их снова? – Servy

+0

Ваши методы не имеют смысла. Параметры, которые вы передаете, нигде не используются. Вы просто назначаете значения из текста переменным. –

ответ

1

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

Что я хотел бы сделать что-то вроде этого:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void calculate_Click(object sender, RoutedEventArgs e) 
    { 

     int val, val1, val2; 


     if (!int.TryParse(first.Text, out val)) 
     { 
      val=0; // Invalid or blank input get's a zero (or you could show an error message) 
     } 

     if (!int.TryParse(second.Text, out val1)) 
     { 
      val1=0; // Invalid or blank input get's a zero (or you could show an error message) 
     } 

     if (!int.TryParse(third.Text, out val2)) 
     { 
      val2=0; // Invalid or blank input get's a zero (or you could show an error message) 
     } 

     if ((bool)oneValue.IsChecked) 
      showTotal(val); 
     else if ((bool)twoValues.IsChecked) 
      showTotal(val, val1); 
     else if ((bool)threeValues.IsChecked) 
      showTotal(val, val1, val2); 
    } 

     private void showTotal(int val, int val1, int val2) 
    { 
     int total = val + val1 + val2; 
     result.Text = total.ToString(); 
    } 

    private void showTotal(int val, int val1) 
    { 
     int total = val + val1; 
     result.Text = total.ToString(); 
    } 

    private void showTotal(int val) 
    { 
     result.Text = val.ToString(); 
    } 

    private void quit_Click(object sender, RoutedEventArgs e) 
    { 
     this.Close(); 
    } 
} 
+0

У меня все правильно. У меня есть 3 текстовых поля, относящихся к каждому методу, который содержит 1 2 или 3 параметра. Другими словами, если в одном текстовом поле есть значение, я проверяю флажок 1, который запускает метод с одним параметром в нем. Я могу заставить его работать без проблем, используя ref и меняя имена методов друг от друга, просто делал некоторые попытки и экспериментировал, поскольку я новичок в программировании. – user3158518

+0

Спасибо, что ваш код отлично работает! – user3158518

1

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

int val; 
if (!int.TryParse(first.Text, out val)) 
{ 
    // Handle error 
} 

Второй вопрос заключается в том, что вы в основном перезапись параметров вы передаете. Почему не просто либо имеют различные методы для # входов или выберите один параметр, указывающий, сколько входных данных вы должны использовать.

Фактически, я не уверен, что перегрузка здесь - правильный подход. Почему бы не использовать Params:

private void showTotal(params string[] inputs) 
{ 
    int total = 0; 
    foreach (string input in inputs) 
    { 
     int val; 
     if (int.TryParse(input, out val)) 
      total += total; 
    } 
    result.Text = total.ToString(); 
} 

Вы можете назвать это как

if ((bool)oneValue.IsChecked) 
     showTotal(first.Text); 
    else if ((bool)twoValues.IsChecked) 
     showTotal(first.Text, second.Text); 
    else if ((bool)threeValues.IsChecked) 
     showTotal(first.Text, second.Text, third.Text); 
+0

Привет, спасибо за ответ. Yip Я могу заставить его работать без проблем, используя либо разные имена методов, либо немного меняя код, и используя ключевое слово ref. Дело в том, что я пытался понять, как я могу использовать перегруженные методы, чтобы сделать то же самое. – user3158518

+0

Обновленный ответ @ user3158518 – Matt

0

Вы уверены, что значение first.Text, second.Text и third.Text целые значения? Вызов int.Parse() на нецелое значение вызовет ошибку. Вы можете посмотреть в использовании int.TryParse() вместо:

private void showTotal(int val) 
{ 
    bool gotResult = int.TryParse(first.Text, out val); 

    if(gotResult) 
     result.Text = val.ToString(); 
} 

Кроме того, я уверен, что ваше приложение не удается на «один» и «два» сценария, потому что этот код:

private void calculate_Click(object sender, RoutedEventArgs e) 
{ 
    int val = int.Parse(first.Text); 
    int val1 = int.Parse(second.Text); 
    int val2 = int.Parse(third.Text); 

Воле fail, если first, second и third все содержат значения. Если second или third содержит пустую или пустую строку, вы получите сообщение об ошибке int.Parse.

1

1) Вы пытаетесь анализировать ваши ценности дважды

2) здесь Ваш BOOL литая избыточен, поскольку IsChecked уже BOOL

if ((bool)oneValue.IsChecked) 

3) Вместо синтаксиса используйте TryParse, он не будет исключать исключение

int val, val1, val2; 

if (oneValue.IsChecked) 
{ 
    if (int.TryParse(first.Text, val)) 
    { 
     showTotal(val); 
    } 
} 

    else if (twoValues.IsChecked) 
    { 
    if (int.TryParse(second.Text, val1)) 
    { 
     showTotal(val, val1); 
    } 
    } 

    else if (threeValues.IsChecked) 
    { 
    if (int.TryParse(third.Text, val2) 
    { 
     showTotal(val, val1, val2); 
    } 
    } 

4) Кроме того, вы можете использовать params keyword вместо метода overloading.I думаю, он больше подходит в вашем case.With Params ключевое слово, вы можете сделать свою работу с одним методом, как это:

private void showTotal(params int[] numbers) 
{ 
    if(numbers != null) 
    { 
    int sum = numbers.Sum(); 
    result.Text = sum.ToString(); 
    } 
} 
Смежные вопросы