簡體   English   中英

為什么resharper建議只讀字段

[英]Why does resharper suggest readonly fields

為什么ReSharper在下面的示例中建議“設置”的只讀字段?

如果我理解正確,如果僅在構造函數中更改此字段,則應使用readonly修飾符,但在我的示例中,我也在同一個類中的另一個方法中更改它。

我錯過了什么?

public partial class OptionsForm : Form
{
    private Settings settings;

    public OptionsForm(Settings s)
    {
        settings = s;
    }

    private void SaveData()
    {
        settings.ProjectName = TextBoxProject.Text;
    }
}

當引用類型聲明為readonly時,指針是不可變的,但不是它指向的對象。 這意味着:

  • 可以初始化引用類型數據成員以指向類的實例,但是一旦完成,就不可能使它指向構造函數之外的類的另一個實例
  • readonly修飾符對readonly數據成員指向的對象沒有影響。

閱讀詳細的文章

在只讀時將C#類數據成員標記為只讀

請記住,編碼標准和設計模式的主要原因是讓人們更容易理解您的代碼。

通過將字段標記為“只讀”,您告訴該類的讀者他們不需要考慮字段的值如何更改。

然而,由於只讀字段指向的對象可以使其狀態發生變化,因此將字段標記為只讀可能會產生誤導。 因此,考慮一下天氣,它可以幫助您的代碼的讀者(例如一個人) 了解您的設計。

如果字段指向的對象中的值在對象生存期內發生變化,那么我認為字段不應該標記為只讀。 (例如,指向的對象應該表現得好像在您的類上的承包商被調用時它是不可變的)

(但是有一些例外,例如,即使記錄器確實更改了日志文件的狀態,也可以使用只讀字段指向記錄器。)

ReSharper建議只讀“設置”:

readonly private Settings settings;

public OptionsForm(Settings s)
{
    settings = s;
}

因為,在掃描您的代碼時,它得出結論,您的“設置”字段僅出現在同一個類的構造函數中。

如果你要在這個類中提供修改“設置”的部分類或其他代碼,那么它將不再表示它是readonly。

一旦標記為只讀,編譯器將標記為警告各種字段的濫用,例如:

The left-hand side of an assignment must be an l-value

當您嘗試將值分配給常量時,會出現同樣的錯誤。

refout參數修飾符的使用也是有限的。

通過遵循ReSharpers建議,如果您嘗試濫用在初始化后確實不打算更改的字段,編譯器將會發出警告。

您沒有更改構造函數之外的設置,該對象與SaveData中的對象相同。 對象屬性可能正在改變,但不是對象引用,因此從Resharper角度來看似乎有意義。

SaveData()方法不會更改設置變量,它會更改其屬性。 設置的內容(它引用的內容)僅在構造函數中設置。

實際上,你是對的,Resharper是錯的。 如果字段完全不可變,則只應標記為只讀字段。 在您的示例中,如果您只讀它並啟用Microsoft的代碼分析,它將警告您Settings具有可變屬性。

這似乎有點奇怪,我無法想象Eric Lippert等人沒有考慮這樣一個顯而易見的事實,即引用不可變引用不會使引用不可變引用實例,盡管提到的代碼分析規則確實如此。支持上述觀點(http://msdn.microsoft.com/en-us/library/ms182302(v=VS.100).aspx)。

它仍然沒有任何意義。 如果可變實例不應該是readonly,那么,在我看來,它應該是一個編譯時錯誤,否則看起來毫無意義。

我可以看到使用引用不可變,而不是它指向的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM