如果适当的话,将C#字段设为只读是否有任何好处?

Mat*_*att 23 c# resharper cil readonly

我正在使用ReSharper开发一个项目.有时它会提示我可以只读取一个字段.这有什么表现或其他好处吗?我认为它的好处是相当低级的,或者任何好处都是纯粹的语义?

谢谢

在下面的示例中,该字段最初只是私有,但resharper提示将其设置为只读.我理解为什么它可以设置为只读,即.它是在构造函数中设置而不是再次更改,但只是想知道这是否有任何好处......

public class MarketsController : Controller
{
    private readonly IMarketsRepository marketsRepository;

    public AnalysisController(IMarketsRepository marketsRepository)
    {                
        this.marketsRepository = marketsRepository;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑 查看MSIL的最简单方法是什么?

And*_*rey 26

好处纯粹是语义上的.它将帮助您的代码用户明确地了解在创建对象后无法更改此字段.编译器将阻止对此字段进行不必要的更改.我完全同意Python Zen的以下引用:

显式优于隐式.

一些细节:

正常字段和只读字段之间的唯一区别是initonlyIL中的标志.它没有优化(与常量一样),因为它实际上允许所有操作(获取和设置,但仅限于ctor).它只是提示编译器:不要让它在构造后改变.

.field public initonly int32 R
Run Code Online (Sandbox Code Playgroud)

  • +1:关于只读字段的明确有助于在推理多线程系统时大量使用.将实例字段添加到任何类时,应考虑是否应该更改.如果没有,请将其标记为只读 - 简单.事实上,我有时认为应该有一个'可变的'关键字而不是'readonly'(对F#及其母语言的点头). (5认同)

tda*_*ers 9

它不是低级性能,而是更高级别的可维护性.只读内容是限制和控制某个值可以更改的位置数量的可能性之一.这反过来意味着你减少了类之间的相互依赖性(又名"松散耦合"); 结果是应用程序具有较少的内部依赖性,因此具有较低的复杂性.换句话说,只读字段和属性使您的应用程序更易于维护.