为什么resharper建议只读字段

sve*_*vit 12 c# resharper readonly

为什么ReSharper在下面的示例中建议"设置"的只读字段?

如果我理解正确,readonly如果仅在构造函数中更改此字段,则应使用修饰符,但在我的示例中,我还在同一个类中的另一个方法中更改它.

我错过了什么?

public partial class OptionsForm : Form
{
    private Settings settings;

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

    private void SaveData()
    {
        settings.ProjectName = TextBoxProject.Text;
    }
}
Run Code Online (Sandbox Code Playgroud)

rah*_*hul 26

当引用类型声明为readonly时,指针是不可变的,但不是它指向的对象.这意味着:

  • 可以初始化引用类型数据成员以指向类的实例,但是一旦完成,就不可能使它指向构造函数之外的类的另一个实例
  • readonly修饰符对readonly数据成员指向的对象没有影响.

阅读详细的文章

在只读时将C#类数据成员标记为只读

  • "设置"是只读的.你永远不会说"settings = someOtherSettings"或"settings = new Settings()"."ProjectName"不是"设置"."settings"是指向内存中某个OBJECT的POINTER."ProjectName"是该OBJECT的属性,而不是POINTER"settings"的属性. (2认同)

Ian*_*ose 5

请记住,编码标准和设计模式的主要原因是使人们更容易理解您的代码。

通过将字段标记为“只读”,您可以告诉类的读者,他们无需考虑字段值的更改方式。

但是,作为只读字段指向的对象可以更改其状态,将字段标记为只读有时可能会引起误解。因此,考虑一下天气,它可以帮助您的代码读者(例如一个人)了解您的设计。

如果该字段指向的对象中的值在对象生存期内更改,那么我认为不应将字段标记为只读。(例如,所指向的对象应该表现得好像在调用类的承包商时是不可变的)

(但是,有一些例外,例如,即使认为记录器确实更改了日志文件的状态,也可以使用只读字段指向记录器。)