2012-12-07 81 views
1

是否有更清晰的方式來編寫此代碼。我可能會有這種感覺,但我不知道如何。乾淨的方法來編寫空值布爾代碼

if (loadedFormData.Education.AwardedADegree==true) 
    { 
     this.radiobuttonNoAwarded.Checked = false; 
     this.radiobuttonYesAwarded.Checked = true; 
    } 
    if (loadedFormData.Education.AwardedADegree == false) 
    { 
     this.radiobuttonNoAwarded.Checked = true; 
     this.radiobuttonYesAwarded.Checked = false; 
    } 
    else // AwardedADegree is null 
    { 
     this.radiobuttonNoAwarded.Checked = false; 
     this.radiobuttonYesAwarded.Checked = false; 

    } 
+1

這也許應該在代碼審查公佈,並非如此。 – Servy

+0

你需要澄清它是可空的。 – SLaks

+3

值得注意的是,在你原來的邏輯中有一個錯誤,因爲你的第二個如果不是elseif。如果'AwardedADegree'爲true,那麼它將按預期運行第一個塊,但也會運行else塊。我認爲這是一個錯誤,而不是設計。 :) – Chris

回答

11

問「時,應我radiobutton檢查」,而不是「當我的數據是真/假/空會發生什麼」。

this.radiobuttonNoAwarded.Checked = loadedFormData.Education.AwardedADegree == false; 
this.radiobuttonYesAwarded.Checked = loadedFormData.Education.AwardedADegree == true; 
+1

我喜歡這個回答。 Upvoted。但是由於許多開發人員並不期望解除操作符(在這種情況下解除'=='),我個人傾向於編寫'loadedFormData.Education.AwardedADegree ==(bool?)false'。這使得這樣的代碼更容易理解,因爲人們可能不會立即意識到「AwardedADegree」是可空的。 –

5

我假設bool?允許值爲null。

this.radiobuttonNoAwarded.Checked = AwardedADegree.HasValue && AwardedADegree.Value; 
this.radiobuttonYesAwarded.Checked = AwardedADegree.HasValue && !AwardedADegree.Value; 
+1

Rotem的回答其實是正確的。 'operator =='被解除以能夠比較'bool'和'bool?'並返回正確的結果。 (並用少於這裏的代碼來實現) – Servy

+0

@Erik我不明白這個可爲空的布爾如何使我的答案無效(雙關意圖) – Rotem

+1

@Rotem或者我對==運算符缺乏理解'bool?'!雖然我仍然會這樣寫,因爲它更冗長一些。 –

1

試試這個:

this.radiobuttonNoAwarded.Checked = (!loadedFormData.Education.AwardedADegree) ?? false; 
this.radiobuttonYesAwarded.Checked = loadedFormData.Education.AwardedADegree ?? false; 
0
this.radiobuttonNoAwarded.Checked = (loadedFormData.Education.AwardedADegree ?? false); 
this.radiobuttonYesAwarded.Checked = !(loadedFormData.Education.AwardedADegree ?? true); 
+0

@Nicolas Voron - 對不起,我們一定是在同一時間輸入我們的答案。 :=) – Kevin

+0

沒問題。但你的回答不正確。 'radiobuttonNoAwarded'必須是'AwardedADegree'的否定。在你的解決方案中,事實並非如此。 (編輯:你的第二行也是不正確的))) –