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

时间:2010-08-03 10:03:07

标签: c# resharper readonly cil

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

由于

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

public class MarketsController : Controller
{
    private readonly IMarketsRepository marketsRepository;

    public AnalysisController(IMarketsRepository marketsRepository)
    {                
        this.marketsRepository = marketsRepository;
    }
}

修改 查看MSIL的最简单方法是什么?

5 个答案:

答案 0 :(得分:25)

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

  

明确比隐含更好。

一些细节:

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

.field public initonly int32 R

答案 1 :(得分:9)

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

答案 2 :(得分:3)

我的教授在当天告诉我,宣布一些只读的方式是让你的计算机误入歧途的方式。

答案 3 :(得分:2)

它也可能有助于发现一些错误。该值仅在构造函数中分配,如果您忘记在其他地方更改,这可能是一个问题。如果它不应该被更改,那么你将它标记为只读。

答案 4 :(得分:1)

您可能对this answer感兴趣。

  

readonly关键字用于   将成员变量声明为常量,   但允许计算值   在运行时。这与a不同   用const声明的常量   修饰符,必须具有其值   在编译时设置。使用readonly   您可以设置字段的值   要么在宣言中,要么在宣言中   该对象的构造函数   field是。的成员。