【问题标题】:Am using tryparse, but still getting crashes我正在使用 tryparse,但仍然出现崩溃
【发布时间】:2014-05-09 22:55:12
【问题描述】:

我一直在研究http://www.homeandlearn.co.uk/csharp/csharp_s3p9.html 并编写了一个简单的循环乘法工具,并希望添加 tryparse 以阻止空白崩溃。

但是,如果我使用以下代码将第一个框留空,我仍然会崩溃:

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

        private void button1_Click(object sender, EventArgs e)
        {
            int loopStart = int.Parse(textBox1.Text);
            int loopEnd = int.Parse(textBox2.Text);
            int multiply = int.Parse(textBox3.Text);
            int answer = 0;
            listBox1.Items.Clear();
            int firstNum = 0;
            bool isNumber = int.TryParse(textBox1.Text, out firstNum);

            if (!isNumber)
            {
                MessageBox.Show("bah");
            }
            else            
            {
                for (int i = loopStart; i <= loopEnd; i++)
                {
                    answer = multiply * i;
                    listBox1.Items.Add(i + " times " + multiply + 
                                         " = " + answer.ToString());
                }
            }
        }
    }
}

谁能帮忙解释一下原因?我查看了多个站点(布尔代码略有不同的主要原因),但似乎无法使其工作。这是如果我将 box1 留空但在其他 2 中输入数字。

我看到我投了反对票 - 我不确定为什么这是我第一次来这里而且我是一名初学者编码器 - 也许我的问题看起来相当基本。我没有抱怨,我真的很想知道我做错了什么,这样我以后就不会再犯错误了,因为我相信我会回到这里几次。

感谢下面的回复,对我很有帮助。

【问题讨论】:

    标签: c# tryparse


    【解决方案1】:

    您没有使用TryParse,您在第一次调用TryParse 之前使用Parse 方法,这会引发异常。将您的Parse 调用更改为TryParse,然后检查每个调用的结果。

    int loopStart,loopEnd,multiply;  
    
    if(int.TryParse(textBox1.Text, out loopStart) &&
       int.TryParse(textBox2.Text, out loopEnd)
       int.TryParse(textBox3.Text, out multiply))
    {
        // parsing successfull
    }
    

    【讨论】:

    • 优秀 - 这似乎停止了崩溃。我不太明白为什么。我知道它是在说如果它返回一个真实的数字该怎么办,但是我不明白它是如何说“如果没有有效的数字,什么也不做(即不要失败)”
    【解决方案2】:

    正如大家所说,您在TryParse 之前使用Parse,这就是它崩溃的原因。我认为您不了解TryParse 的作用。 TryParse 是二合一的捷径。这样做:

    int loopStart = 0;
    bool isLoopStartNumber = int.TryParse(textBox1.Text, out loopStart);
    

    完全等价于:

    int loopStart = 0;
    bool isLoopStartNumber = false;
    try {
        loopStart = int.Parse(textBox1.Text);
        isLoopStartNumber = true;
    } catch {
        isLoopStartNumber = false;
    }
    

    如您所见,TryParse 提供了一种更清洁、更简单的方式来完成后者。两行代码与 8 行代码。此外,TryParse 禁止抛出实际异常,这使其比后者更快。

    【讨论】:

    • 希望自己不要太挑剔,但也不完全等价。它在功能上是等效的。 TryParse 方法实际上从未引发异常。这使它更快(并且更易于使用)。
    • @KevinS -- 你是对的,我修改了我的答案以反映它。
    【解决方案3】:

    它崩溃是因为您仍在代码中使用Parse 而不是int,比如空白?

    删除:

    int loopStart = int.Parse(textBox1.Text)
    

    只需使用TryParse

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 1970-01-01
      • 2019-09-05
      • 2022-01-04
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      相关资源
      最近更新 更多