我正在使用ReSharper开发一个项目。有时它会提示我可以只读取一个字段。这有什么表现或其他好处吗?我认为它的好处是相当低级的,或者任何好处都是纯粹的语义?
由于
在下面的示例中,该字段最初只是私有,但resharper提示将其设置为只读。我理解为什么它可以设置为只读,即。它是在构造函数中设置而不是再次更改,但只是想知道这是否有任何好处...
public class MarketsController : Controller
{
private readonly IMarketsRepository marketsRepository;
public AnalysisController(IMarketsRepository marketsRepository)
{
this.marketsRepository = marketsRepository;
}
}
修改 查看MSIL的最简单方法是什么?
答案 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是。的成员。