我想知道在C#中使用ifs時是否存在性能差異,並且它們是嵌套的還是不嵌套的。這裏有一個例子:嵌套或不嵌套if-blocks?
if(hello == true) {
if(index == 34) {
DoSomething();
}
}
這是高於或低於此:
if(hello == true && index == 34) {
DoSomething();
}
任何想法?
我想知道在C#中使用ifs時是否存在性能差異,並且它們是嵌套的還是不嵌套的。這裏有一個例子:嵌套或不嵌套if-blocks?
if(hello == true) {
if(index == 34) {
DoSomething();
}
}
這是高於或低於此:
if(hello == true && index == 34) {
DoSomething();
}
任何想法?
可能編譯器足夠聰明,可以爲兩個版本生成相同或非常相似的代碼。除非性能確實是您應用程序的關鍵因素,否則爲了代碼可讀性,我會自動選擇第二個版本。
完全同意,我很確定在低水平寫下來的方式會一個接一個地轉變成兩個JE或JNE指令。 http://www.csee.umbc.edu/courses/undergraduate/CMSC313/fall04/burt_katz/lectures/Lect05/decisionMaking.html – GBrian 2015-05-26 09:31:57
我看不出會有任何很大的性能差異,但我確實認爲選項二更具可讀性。
使用哪一個最易讀,仍然正確(有時候在布爾表達式周圍玩耍會讓你有不同的行爲 - 尤其是如果涉及到短路的話)。執行時間將是相同的(或者太接近)。爲了記錄,有時我發現嵌套更具可讀性(如果表達結果太長或者組件太多),有時候我發現它的可讀性較差(如在你的簡短例子中) 。
我不相信有可能會在兩個執行之間遇到的任何性能差異..
無論如何,我去爲後者實現,因爲它更具有可讀性。
取決於編譯器。如果在嵌套如果關閉之後但在外部關閉之前有代碼,則差異會更明顯。
我很想知道這個我自己。但是,這些選項之間確實沒有什麼區別(或者沒有太多可說的)。可讀性方面,第二個選項更具可讀性,所以我通常會選擇那一個,除非我預計由於某種原因需要針對每個條件專門編寫代碼。
更妙的是
if(SomethingShouldBeDone()) {
DoSomething();
}
...與此同時,在另一個城市的一部分...
private bool SomethingShouldBeDone()
{
return this.hello == true && this.index == 34;
}
在現實生活中的情況下,99%,這將有很少或沒有性能影響,並且提供了有意義的名稱,這將更容易閱讀,理解和(因此)維護。
這可能是一種個人偏好,但我不同意這樣做更具可讀性,因爲這是不可能的看看這個方法做什麼,除非你去那個方法去檢查它。在任何情況下,我都會用getter來做這個屬性,而不是一個方法,因爲它描述了一個類的*屬性*,而不是主動地做一些類似於方法的事情(比如從數據庫中獲取某些東西)。 – JulianR 2009-11-01 15:53:03
通常我們會在這裏討論局部變量。你很奇怪的認爲'hello'和'index'是字段。 – Joren 2009-11-01 16:17:06
如果我在多個地方執行相同的評估,或者原始的IF語句相當長,我只會使用它。這只是增加了不必要的複雜性。 – MartW 2009-11-01 16:20:14
任何現代編譯器,我的意思是過去20年來建造的任何編譯器都會將它們編譯成相同的代碼。
至於你應該使用哪一個,那麼它取決於在項目上下文中哪一個更具可讀性和邏輯性)。一般來說,我會第二次自己去,但那會有所不同。
一個值得考慮的重點是維護。我追捕的一個比較常見的錯誤是嵌套ifs中嵌套的if/else。如果你有一系列複雜的條件,經過幾年不同程序員的修改,這種情況就會出現。例如使用僞代碼的簡單情況:
IF condition_a
IF condition_b
Do something
ELSE
Do something
END IF
ELSE
IF condition_b
Do something
END IF
END IF
你的組合注意到condition_a & & condition_b代碼都將落空無爲的條件!這對於這對情況來說很容易發現,但一旦有3,4個或更多的if/else條件檢查時,很容易很快錯過。通常發生的情況是,嵌套結構在首次編碼時是正確的,但在稍後的某個時間點會變得不正確(就業務輸出而言),因爲維護程序員不會理解或允許全部選項。
因此,隨着時間的推移,它通常在if結構中使用組合條件進行編碼,並採用最可行的結構並使嵌套保持最小,因此,舉例來說,沒有合理的理由不將這兩個條件合併爲一個單一的聲明,那麼你應該這樣做
你不必比較布爾與真實。如果(你好)...或者(你好&&索引== 34)...好得多。 – sdcvvc 2009-11-01 16:24:24
我知道,我只是想說清楚。 – Bevin 2009-11-01 19:24:23