2010-08-03 94 views
12

我注意到「常見做法和代碼改進」下的Resharper建議:將本地變量或字段轉換爲常量爲什麼Resharper更喜歡const只讀?

我也注意到,在比爾·瓦格納的書「Effective C#: 50 Specific Ways to Improve Your C#」存在的langauge成語「不想只讀爲const」中,作者解釋使用consts的風險。

我的問題不是關於readonly和const之間以及何時使用它們之間的區別,而是爲什麼一個源代碼將const作爲常見做法/代碼改進,另一方面第二個將readonly視爲一個習慣用法?

+4

仔細閱讀:「我的問題不是關於readonly和const之間的區別以及何時使用它們......」 – 2010-08-03 16:12:29

回答

9

私人常數與公共常量不具有相同的風險。 Resharper大概建議在場外不可見的情況下進行性能優化。

+1

這裏是關鍵。私有常量沒有可維護性問題,因爲它們不能直接烘焙到外部程序集中。 – 2010-08-03 16:26:49

2

根據我對Resharper的經驗,如果您在聲明中設置了一個變量值,您會得到這個建議,但該變量的值在整個方法中都不會改變。在這種情況下,它可以變成一個局部常量。你也會在你初始化的實例變量上得到警告,但是永遠不會改變類體中任何地方的值。

而且該書的作者基本上認爲,通過使用readonly而不是const,可以避免在更改readonly值的值時重建相關程序集。相反,如果要更改爲const,則必須使用const針對新版本的程序集重新編譯相關程序集。

這是一個合理的論點,但是,如果一個值在應用程序的整個生命週期中不會改變,我仍然認爲使用const更好。我喜歡使用readonly作爲我從配置中加載的值,例如,在構造函數中初始化後不會更改。

我認爲const提供的代碼清晰度要好得多,以犧牲更多的編譯維護爲代價。

+0

它甚至在初始化readonly字段時問我。 – 2010-08-03 16:13:01

+0

是的,如果只讀字段被聲明爲一個實例變量,並且您不會在代碼中的任何位置更改它的值,則會得到該警告。我傾向於贊同Resharper,而不是比爾瓦格納,因爲我在編輯中提到的原因。但瓦格納說得很好,這只是一個意見問題。 – dcp 2010-08-03 16:15:07