2010-03-07 41 views
21

爲了澄清這個問題,我想補充一點,我不是問爲什麼我應該選擇readonly而不是const,或者readonly比const更有什麼好處。爲什麼resharper建議在未更改的字段中使用readonly?

我在問爲什麼只讀字段只是因爲它沒有改變(此刻)。

例如: 如果我寫了下面的類:

public class MyClass 
{ 
     public int _i = 5; 

     // Code that doesn't change the value of i: 
     ... 
} 

ReSharper的將表明,它可以製成只讀。

感謝

+4

這是錯誤的建議,你公開了該字段。如果它會建議使用財產,那麼它會給你很好的建議。 – 2010-03-07 13:32:41

回答

29

當它檢測到您沒有分配給除了在動初始化的變量,它假設你不希望要改變的變量。使變量只讀(或const)將阻止您將來分配給變量。由於這看起來(通過使用)是您想要的行爲,因此建議您將其正式化並獲得保護的好處。

+0

任何關心評論downvote?當我可能錯誤時,我總是渴望學習。 – tvanfosson 2010-03-07 12:58:12

+0

似乎清楚Saulius倒投了我們倆。 – Hogan 2010-03-07 13:22:17

+1

@Hogan:Saulius在他的個人資料頁面中沒有任何downvotes。我估計是另一個糟糕的一天。 – 2010-03-07 13:31:14

3

Resharper是一個工具,它看不到任何東西,但只顯示它的代碼。如果您打算在將來更改代碼,Resharper無法瞭解 - 因此它會根據您當前的代碼提出建議。

3

呃,很明顯,一個永遠不會改變的變量應該是const或只讀的。問題哪一個更好取決於情況。 const變量按定義是常量 - 它們的值應該爲從不改變(例如const int minutesInAnHour = 60;看起來像是一個好候選)。這就是爲什麼常量是隱式靜態成員,並且它在編譯期間被初始化,即編譯器可能實際上將常量的所有外觀替換爲文字值,儘管我不確定是否有編譯器實際執行此操作。

另一方面,只讀是一個成員變量,其值不應該改變,一旦初始化,意味着它實際上不是一個常量,你可以在readonly DateTime time = DateTime.Now;的行中做一些事情。當然,這不會是一個靜態成員,實際上它只是一個正常的成員,只是有一個限制,它一旦分配後就不能改變。這與常量的好處是,如果你的const變量在一些構建中發生變化,其他的庫​​文件可能不知道 - 它們甚至可以將常量值填入 - 你必須重新編譯一切。

至於爲什麼resharper建議readonly與const的問題 - 我不確定,我猜測readonly變量的限制性較小,它表示這就是開發人員可能想要的。

+0

關於只讀性,有兩種引用類型的字段:可以安全地假定始終指向同一對象的那些字段,以及可以安全地指向不同對象的那些字段。第一種類型的字段應該是「只讀」的,不管它們引用的對象是可變的還是不可變的;第二種類型的字段不應該是「只讀」的,即使這個類在施工後目前沒有理由改變它們。例如,如果類似'List '的類的第一個版本需要在其構造函數中指定大小...... – supercat 2012-11-19 18:01:38

+0

...它可能會在其構造函數中創建一個數組並永遠使用同一個數組。如果沒有代碼依賴於繼續使用同一個數組,那麼未來版本的類可能會提供一個'Resize'方法來創建一個新數組,將元素從舊數組複製到新數組,然後放棄舊數組。但是,如果任何代碼都依賴於總是使用相同數組的類,那麼這樣的方法將無法工作。是否宣佈陣列爲「只讀」將決定允許哪條未來擴展。 – supercat 2012-11-19 18:04:38

3

Resharper將表明它可以只讀。

要添加到其他答案,請注意,您可以更改此檢查的嚴重性ReSharper | Options | Code Inspection | Inspection Severity | Field can be made readonly。我把它看作'顯示爲建議';如果你願意,你可以要求ReSharper完全忽略這個檢查。

5

我通常會嘗試記住來做Resharper試圖提醒你做的事情。如果我有任何不可改變的字段,我喜歡用readonly來標記它們以正式確定它。在許多類型中,我會這樣做所有的領域。有benefits of immutability[2][3]),和Resharper正試圖幫助你利用它們。

我個人不使用Resharper。我有我的理由。

+1

幫助我瞭解:您試着記住ReSharper試圖提醒您做的事情,但您不會親自使用ReSharper。這兩種說法相互矛盾。 – 2010-03-07 13:57:52

+3

我讀到他的陳述爲「我同意R#給你的那些規則,並嘗試自己去關注它們,儘管我自己(不再使用R#)」。 – 2010-03-07 14:43:49

+1

@John Saunders:在我的發言中,「你」是字面的,指的是OP,而不是代詞「one」的替代。如果Resharper在提醒**我什麼的話,那麼我不一定要自己去記住它。 – 2010-03-07 14:55:38