2015-05-09 42 views
1

我在想,如果我可以縮短這個:返回值時可以執行代碼嗎?

bool Check() 
{ 
return textBox1.Text.All(char.IsDigit) ? true : Falsepath(); 
} 

bool Falsepath() 
{ 
MessageBox.Show("The data you entered is incorrect","Error",MessageBoxButtons.OK); 
return false; 
}  

爲了這樣的事情:

bool Check() 
     { 
     return textBox1.Text.All(char.IsDigit) ? true : (sender, e) => 
       { 
       MessageBox.Show("The data you entered is incorrect", "Error", MessageBoxButtons.OK); 
       return false; 
       }; 
     } 

當然,我進入第二個代碼不正確的,但我使用它作爲一個例。

那麼,我可以在檢查某個東西時執行代碼,還是必須使用單獨的功能?

+1

無 - 三元運營商期望的2分的結果是準確相同的類型。 –

+1

有'if'運算符,使用它。不要以不正當的方式濫用語法糖。 –

+0

@ General-Doomer「if」是一個關鍵字。 '?'是一個運算符 – xanatos

回答

2

你可以寫:

bool Check() 
{ 
    return textBox1.Text.All(char.IsDigit) ? 
      true : 
      ((Func<bool>)(() => 
      { 
       MessageBox.Show("The data you entered is incorrect", "Error", MessageBoxButtons.OK); 
       return false; 
      }))(); 
} 

但它是可怕的,請不要這麼做! ...

不幸的是,在C#中,您必須明確告訴編譯器匿名函數的類型。這使一切變得更加複雜。看演員陣容到(Func<bool>)?在Javascript中,你不需要它,事實上在這種語言中,這是一種常見的模式。在C#中,它不是因爲它是難以讀懂和難看的

注意最後的()執行匿名方法。

注意,在這種特殊情況下,你可以寫:

bool Check() 
{ 
    return textBox1.Text.All(char.IsDigit) ? 
      true : 
      MessageBox.Show("The data you entered is incorrect", "Error", MessageBoxButtons.OK) == DialogResult.Abort; 
} 

所以調用MessageBox.Show()和的方式,比較是false它的結果進行比較。

+0

聰明,可怕。什麼是在C#中調用的'()'語法?這不是我想象的IIFE,因爲這是一個Javascript概念。 –

+0

@DavidL這是標準的方法執行。如果有參數,它將是'(foo)'。這部分在JS中是一樣的。 – xanatos

+0

啊,對,我現在看到它。你是對的,它是不可讀的。語法完全混淆了我。 –

1

你真的需要三元運算符嗎?

bool Check() 
{ 
    if (textBox1.Text.All(char.IsDigit)) 
    { 
     return true; 
    } 
    else 
    { 
     MessageBox.Show("The data you entered is incorrect","Error",MessageBoxButtons.OK); 
     return false; 
    } 
} 
+0

不適用於我在此處作爲示例編寫的代碼,但對於我正在使用的代碼是。我有很多東西要檢查 –

0

閱讀和維護這樣的代碼是很痛苦的。在頂層,你有三元運算符,它被加載到開發人員的大腦(工作記憶)中。然後你添加lambda表達式,這也應該加載。然後你添加一些通知用戶的功能。

所以我需要保持在大腦中我展示裏面的λ錯誤對話框 函數,它是三元運算符,檢查所有 字符某處是否是數字的一部分。所有這些人員都會在方法調用 上下文中檢查某些內容(您已經處於某種功能的中間)。

Average person can keep about 7 things in the working memory.如果添加更多信息,則開始忘記以前的數據。爲什麼使方法如此複雜,如果你可以保持簡單?簡單的方法可以讓你在大腦中保持更高層次的上下文。

另一個問題是混淆方法名稱,它應該只檢查一些東西。它不應該通知用戶或執行其他操作。給方法和控制賦予有意義的名稱。

bool IsSocialSecurityNumberValid(string ssn) 
{ 
    return ssn.All(char.IsDigit); 
} 

而調用該方法:

if (!IsSocialSecurityNumberValid(ssnTextBox.Text)) 
    MessageBox.Show("SSN should contain only digits", "Error", MessageBoxButtons.OK); 
+0

事情是,這個檢查實際上是一個社會安全號碼。我只是想給用戶提供有意義的反饋(而不是顯示一個消息框,上面寫着「你輸入的數據不正確」)到一個有10個文本框的表單 –

+0

@AndiAbrudan抱歉,沒有得到你 –

+0

我'我說我有很多東西在表格上。我只是想用戶友好並給出有意義的反饋,當出現問題時不顯示消息,並讓用戶弄清楚他輸入的內容不正確 –