如果不满足IF条件,则在开始时返回并且不做任何事情

时间:2015-04-02 21:08:01

标签: c# if-statement

我有一个非常大的代码所以我不会把它放在这里...... 我做了一些有效的计算,现在我想修理某些东西。

我创建了for循环语句:if(my condition)是true break和  保存,否则if(条件不为真)显示消息框并报告内容  是错误的(例如输入为0且不应为0)。但在那之后  我的计算一直持续到最后,不要止步于此。怎么停下来  它在那里,直到我的状况不满意?

返回什么?我在私人虚拟功能上有它  按钮点击..这困扰我因为我的程序有很多  如果带有显示/隐藏选项的条件。所以当程序继续时  计算它显示了很多0和坏数字..

我正在调用此功能(选中单选按钮)和另一个(按钮单击) if语句中的输入来自转换为数字的文本框

if (Math.Abs(miSdCrtica - _dMiSd) < 0.01)
{
    epsilonS1 = epsilonS1Pretpostavka;
    zeta = zetaRacunska;
    ksi = ksiRacunski;
    xNeutralnaOs = ksi * _dd;
    zKrakSila = zeta * _dd;
    racunskiAs1 = (_dMed * 1000) / (zeta * _dd * dFyd);
    break;
}
else if (_dMiSd < 0.086)
{
    MessageBox.Show("Error - check input");
    return;
}

在此错误之后 - 检查输入内容,代码继续并给我一堆零(0)

我希望这有助于澄清一些事情

问题演示

我有一些用于UI的texbox,用于从2个条件中选择的单选按钮和用于计算的按钮

单选按钮

private void combobox_indexChanged ()
  if statement (radiobutton checked)
     for loop (written above)
       if statement (written above)
       else if statement (written above)

按钮单击

private void button clicked()
   calls radiobutton checked (do calculation)
       hide/show bunch of labels  (their results are 0 with  else if statement from above)

如何停止它所以当显示MessageBox.Show("Error - check input");时,按钮点击功能不会继续隐藏/显示标签,而是在UI正确之前停止?

我希望现在很清楚我想做什么

3 个答案:

答案 0 :(得分:1)

只需使用&#34; return;&#34;在任何想要停止执行的地方退出void方法。

答案 1 :(得分:0)

为什么不在break;行上留下断点?它可能有助于了解您的数字发生了什么,并确保传递正确的值。

当Visual Studio在断点处停止时,将鼠标悬停在代码中的所有变量上,并确保它们有意义。

如果您发现一些看起来不正确的事情,那么您距离确定问题又近了一步。

答案 2 :(得分:0)

从描述中,我认为您的按钮点击事件类似于:

void Button1_Click(...){
    if(radioButton1.Checked){
        RadioButton1Checked();
    }
    if(radioButton2.Checked){
        SomeOtherFunction();
    }
    ...
}

void RadioButton1Checked(){
    for(...){
        //code from the question
    }
}

如果RadioButton1Checked&#34;中的代码失败&#34;您不希望其他代码运行。因此,您可以更改该函数以返回bool

bool RadioButton1Checked(){
    for(...){
        if (Math.Abs(miSdCrtica - _dMiSd) < 0.01)
        {
           //...
            racunskiAs1 = (_dMed * 1000) / (zeta * _dd * dFyd);
            break;
        }
        else if (_dMiSd < 0.086)
        {
            return false;
        }
    }
    return true;
}

void Button1_Click(...){
    if(radioButton1.Checked){
        if(!RadioButton1Checked()){ //if the function returns false
            //Display message box
            return;
        }
    }
    if(radioButton2.Checked){
        if(!SomeOtherFunction()){
            //Display message box
            return;
        }
    }
    ...
}

或者,您可以从函数中抛出ArgumentException并捕获它。

else if (_dMiSd < 0.086)
{
    //I suggest you to specify which input exactly is faulty
    throw new ArgumentException("Error - check input");
}

void Button1_Click(...){
    try{
        if(radioButton1.Checked){
            RadioButton1Checked();
        }
        if(radioButton2.Checked){
            SomeOtherFunction();
        }
        ...
    }catch(ArgumentException e){
        MessageBox.Show(e.Message);
    }
}

一般建议您将所有计算函数设置为参数化。函数应该采用一组参数并仅根据这些参数计算结果(没有在函数作用域外声明的变量 - 即类成员或全局变量)。

我想你有类似的东西:

class ...{
   double epsilonS1;
   double zeta;

   void Button_Click(..){
       double.Parse(textBoxEpsilon.Text, out epsilonSi);
       zeta = 0.02;
       Calculate();
   }

   void Calculate(){
       epsilonS1 = epstilonS1 * zeta * 0.01f;
   }

}

问题在于,如果你的计算过程需要失败 - 那么你已经改变了很多你的全球&#39;变量,并且它不容易返回到先前的状态(在调用函数之前)。

而不是那样,尝试使你的功能如此:

class ...{
   void Button_Click(..){
       double epsilon = 0;
       double.Parse(textBoxEpsilon.Text, out epsilon);
       double result = Calculate(epsilon, zeta);
   }

   //function takes parameters, and returns a result.
   //It neither reads nor changes variables that are outside its scope
   double Calculate(double epsilonS1, double zeta){
       return epsilonS1 * zeta * 0.01f;
   }

}

如果这样写的功能失败,你可以确定它没有改变任何全局变量,所以程序的状态是&#39;与调用函数之前的内容相同。

是的,这是一个很长的答案,需要说的很多(并假设我没有真正看到你的代码)。


P.S。

RadioButton.Checked值是函数的良好参数(与计算相关的值 - 那些仅用于指示UI是否应显示值的值应保留在外部)。而不是基于复选框值调用(我假设你在做什么)许多单独的函数,你可以将这些值传递给函数并根据它们进行计算(或调用其他函数)。

void Calculate(double epsilon, double zeta, bool calculatePhi, bool showZulu){
    epsilon = zeta * 0.01;
    if(calculatePhi){
        phi = epsilon / 2;
        if(phi < 0.1)
            throw new ArgumentException("Invalid input - epsilon");
    } 
}

如果需要从函数返回多个值,一种简单的方法是创建一个包含这些值的类,然后返回该类的实例。

class Result{
    public double Epsilon {get; set;}
    public double Zeta {get;set;}
    ...
    public bool DisplayZeta {get;set;}
}

你的计算函数看起来像:

Result Calculate(double epsilon, double zeta, bool calculatePhi, bool showZulu){
    Result result = new Result();
    result.Epsilon = zeta * 0.01;
    if(showZulu){
       result.DisplayZeta = true;
    } 

    return Result;
}

顺便说一下,当你需要进行计算时,不要将它们放在事件处理程序中,制作执行它们的专用函数(方法)。而不是在RadioButton_Checked(...)事件中进行计算,而是在Calculate()方法中进行,您可以从事件处理程序和按钮单击调用它。