从描述,我想你的按钮单击事件看起来像:
void Button1_Click(...){
if(radioButton1.Checked){
RadioButton1Checked();
}
if(radioButton2.Checked){
SomeOtherFunction();
}
...
}
void RadioButton1Checked(){
for(...){
//code from the question
}
}
你不希望其他代码运行如果RadioButton1Checked代码“失败”。所以你可以改变这个函数返回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;
}
}
问题的是,如果你的计算过程中需要失败 - 那么你已经改变了很多你的“全球性”的变量,并回到之前的状态并不容易(在调用函数之前)。
取而代之的是,尽量让你的功能,像这样:
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;
}
}
如果这样写的函数调用失败,你可以肯定的是它并没有改变任何全局变量,所以程序'状态'与调用函数之前的状态相同。
是的,这是一个很长的答案,需要说的很多(并且假设我没有看到你的代码)。
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()方法中执行此操作,您可以从事件处理函数和按钮单击操作。
看看'while'关键字。 – 2015-04-02 21:09:55
如果您尝试添加一些演示特定场景的代码,那么您可能会得到更好的帮助。诸如“一直到最后,不停止”之类的东西可以被解释为十几种不同的方式。 – AaronLS 2015-04-02 21:10:03
即使代码不完整/不工作,您可以添加注释'//在这里我希望它跳到函数的结尾,而不是继续'来表达您的愿望 – AaronLS 2015-04-02 21:11:34