從描述,我想你的按鈕單擊事件看起來像:
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