转到c#及其用法

时间:2012-07-30 21:01:28

标签: c#

我有一个子程序。它可以确定值是否为空,然后执行某些操作。例如,如果它们为空,则会引发警告。 代码工作正常。但是当值不为空时,警告仍然会弹出。请帮我纠正逻辑。

感谢。

private void btnNew_Click(object sender, EventArgs e)
    {
        try
        {
            if (txtbox1.Text.ToString().Trim() == string.Empty)
            {
                goto Msg1;
            }
            if (txtbox2.Text.ToString().Trim() == string.Empty)
            {
                goto Msg2;
            }
            DataRow dr = mydataSet.Tables[0].NewRow();
            dr["Descript"] = txtbox1.Text;
            dr["Abbr"] = txtbox2.Text;
            dr["SortOrder"] = Convert.ToDecimal(numericOrder.Value);
            if (SortOrders.Contains((decimal)dr["SortOrder"]))
            {
                goto Msg3;
            }
            mydataSet.Tables[0].Rows.Add(dr);
            dgv.DataSource = mydataSet.Tables[0];
        Msg1:
            MessageBox.Show("Description is required.");
        Msg2:
            MessageBox.Show("Abbr is required.");
        Msg3:
            MessageBox.Show("Please select another one, this one is already used.");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

从上面的代码中,你看到了。如果txtbox1有一些值,程序仍会显示Msg1。我想避免它。

6 个答案:

答案 0 :(得分:9)

因为标签只是标签,后面的代码是顺序执行的。

为什么你不能这样做:

    try
    {
        if (txtbox1.Text.ToString().Trim() == string.Empty)
        {
            MessageBox.Show("Description is required.");
            return;
        }
        if (txtbox2.Text.ToString().Trim() == string.Empty)
        {
            MessageBox.Show("Abbr is required.");
            return;
        }
        DataRow dr = mydataSet.Tables[0].NewRow();
        dr["Descript"] = txtbox1.Text;
        dr["Abbr"] = txtbox2.Text;
        dr["SortOrder"] = Convert.ToDecimal(numericOrder.Value);
        if (SortOrders.Contains((decimal)dr["SortOrder"]))
        {
            MessageBox.Show("Please select another one, this one is already used.");
            return;
        }
        mydataSet.Tables[0].Rows.Add(dr);
        dgv.DataSource = mydataSet.Tables[0];
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

它更具可读性。

答案 1 :(得分:4)

重构代码以避免goto - 它是一个遗留物,在正确的面向对象的代码库中没有多大用处。

从方法中返回,抛出异常或构建错误字典都比使用goto更好。

例如,您可以在出现错误情况时添加List<string> errors

如果它是空的,则没有遇到错误,如果不是,则有。

答案 2 :(得分:2)

这是一个很好的案例goto是错误的方法。请改用这样的东西。

private void btnNew_Click(object sender, EventArgs e)
{
    try
    {
        bool error = false;
        if (txtbox1.Text.ToString().Trim() == string.Empty)
        {
            MessageBox.Show("Description is required.");
            error = true;
        }
        if (txtbox2.Text.ToString().Trim() == string.Empty)
        {
            MessageBox.Show("Abbr is required.");
            error = true;
        }
        if (SortOrders.Contains(Convert.ToDecimal(numericOrder.Value)
        {
            MessageBox.Show("Please select another one, this one is already used.");
            error = true;
        }

        if(error)
            return;

        DataRow dr = mydataSet.Tables[0].NewRow();
        dr["Descript"] = txtbox1.Text;
        dr["Abbr"] = txtbox2.Text;
        dr["SortOrder"] = Convert.ToDecimal(numericOrder.Value);
        mydataSet.Tables[0].Rows.Add(dr);
        dgv.DataSource = mydataSet.Tables[0];
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

修改

只是认为我的代码实际上与他的第一个样本没有相同,因为它只显示第一个错误,无论发生了多少。更新了我的样本以适应它。

答案 3 :(得分:0)

我一直被教导要避免像瘟疫一样,这是我多年来一直遵循的东西。在编写代码时,我甚至从未认为它是一种选择。

考虑到这一点,我几年前读过一篇文章(我现在找不到),它说只有当你用它来跳过代码时才能可信地使用gotos,而不是up:规则被困在这里。

点击此处了解详情:Does anyone still use [goto] in C# and if so why?

有更好的方法可以使用goto语句,对于instacne使用“return”(当在方法中间使用时),“break”和“continue”。你有没有用过其中的一个?

答案 4 :(得分:0)

private void btnNew_Click(object sender, EventArgs e)
{
    try
    {
        var description = txtbox1.Text.Trim();
        if (string.IsNullOrEmpty(description))
        {
            MessageBox.Show("Description is required.");
            return;
        }
        var abbr = txtbox2.Text.Trim();
        if (string.IsNullOrEmpty(abbr))
        {
            MessageBox.Show("Abbr is required.");
            return;
        }
        var numericOrderValue = Convert.ToDecimal(numericOrder.Value);
        if (SortOrders.Contains(numericOrderValue)
        {
            MessageBox.Show("Please select another one, this one is already used.");
            return;
        }

        DataRow dr = mydataSet.Tables[0].NewRow();
        dr["Descript"] = description;
        dr["Abbr"] = abbr;          
        dr["SortOrder"] = numericOrderValue;            
        mydataSet.Tables[0].Rows.Add(dr);
        dgv.DataSource = mydataSet.Tables[0];
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

答案 5 :(得分:-1)

private void btnNew_Click(object sender, EventArgs e)
    {
        try
        {
            if (txtbox1.Text.ToString().Trim() == string.Empty)
            {
                MessageBox.Show("Description is required.");
            }
            if (txtbox2.Text.ToString().Trim() == string.Empty)
            {
                MessageBox.Show("Abbr is required.");
            }
            DataRow dr = mydataSet.Tables[0].NewRow();
            dr["Descript"] = txtbox1.Text;
            dr["Abbr"] = txtbox2.Text;
            dr["SortOrder"] = Convert.ToDecimal(numericOrder.Value);
            if (SortOrders.Contains((decimal)dr["SortOrder"]))
            {
               MessageBox.Show("Please select another one, this one is already used.");
            }
            mydataSet.Tables[0].Rows.Add(dr);
            dgv.DataSource = mydataSet.Tables[0];

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

试试这个。它有效。