2009-11-01 105 views
4

我想知道在C#中使用ifs時是否存在性能差異,並且它們是嵌套的還是不嵌套的。這裏有一個例子:嵌套或不嵌套if-blocks?

if(hello == true) { 
    if(index == 34) { 
     DoSomething(); 
    } 
} 

這是高於或低於此:

if(hello == true && index == 34) { 
    DoSomething(); 
} 

任何想法?

+1

你不必比較布爾與真實。如果(你好)...或者(你好&&索引== 34)...好得多。 – sdcvvc 2009-11-01 16:24:24

+0

我知道,我只是想說清楚。 – Bevin 2009-11-01 19:24:23

回答

14

可能編譯器足夠聰明,可以爲兩個版本生成相同或非常相似的代碼。除非性能確實是您應用程序的關鍵因素,否則爲了代碼可讀性,我會自動選擇第二個版本。

+0

完全同意,我很確定在低水平寫下來的方式會一個接一個地轉變成兩個JE或JNE指令。 http://www.csee.umbc.edu/courses/undergraduate/CMSC313/fall04/burt_katz/lectures/Lect05/decisionMaking.html – GBrian 2015-05-26 09:31:57

0

我看不出會有任何很大的性能差異,但我確實認爲選項二更具可讀性。

2

使用哪一個最易讀,仍然正確(有時候在布爾表達式周圍玩耍會讓你有不同的行爲 - 尤其是如果涉及到短路的話)。執行時間將是相同的(或者太接近)。爲了記錄,有時我發現嵌套更具可讀性(如果表達結果太長或者組件太多),有時候我發現它的可讀性較差(如在你的簡短例子中) 。

0

我不相信有可能會在兩個執行之間遇到的任何性能差異..

無論如何,我去爲後者實現,因爲它更具有可讀性。

0

取決於編譯器。如果在嵌套如果關閉之後但在外部關閉之前有代碼,則差異會更明顯。

0

我很想知道這個我自己。但是,這些選項之間確實沒有什麼區別(或者沒有太多可說的)。可讀性方面,第二個選項更具可讀性,所以我通常會選擇那一個,除非我預計由於某種原因需要針對每個條件專門編寫代碼。

5

更妙的是

if(SomethingShouldBeDone()) { 
    DoSomething(); 
} 

...與此同時,在另一個城市的一部分...

private bool SomethingShouldBeDone() 
{ 
    return this.hello == true && this.index == 34; 
} 

在現實生活中的情況下,99%,這將有很少或沒有性能影響,並且提供了有意義的名稱,這將更容易閱讀,理解和(因此)維護。

+3

這可能是一種個人偏好,但我不同意這樣做更具可讀性,因爲這是不可能的看看這個方法做什麼,除非你去那個方法去檢查它。在任何情況下,我都會用getter來做這個屬性,而不是一個方法,因爲它描述了一個類的*屬性*,而不是主動地做一些類似於方法的事情(比如從數據庫中獲取某些東西)。 – JulianR 2009-11-01 15:53:03

+1

通常我們會在這裏討論局部變量。你很奇怪的認爲'hello'和'index'是字段。 – Joren 2009-11-01 16:17:06

+1

如果我在多個地方執行相同的評估,或者原始的IF語句相當長,我只會使用它。這只是增加了不必要的複雜性。 – MartW 2009-11-01 16:20:14

2

任何現代編譯器,我的意思是過去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結構中使用組合條件進行編碼,並採用最可行的結構並使嵌套保持最小,因此,舉例來說,沒有合理的理由不將這兩個條件合併爲一個單一的聲明,那麼你應該這樣做