我有一个非常大的代码所以我不会把它放在这里...... 我做了一些有效的计算,现在我想修理某些东西。
我创建了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正确之前停止?
我希望现在很清楚我想做什么
答案 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()方法中进行,您可以从事件处理程序和按钮单击调用它。