不要声明只读可变引用类型 - 为什么不呢?

Sam*_*der 12 c# fxcop readonly immutability

我一直在阅读这个问题和其他一些答案,虽然我在更改引用和更改当前实例的状态之间有所区别,但我不确定为什么这意味着我不应该只读它.这是因为标记某些东西只是告诉编译器有关该实例的特殊内容,所以它能够将它当作线程安全处理时实际上可能不是吗?

据推测,有些情况下我不希望实例能够被更改,但是不介意实例的状态是否改变(单例可能./ me准备火焰)标记实例的后果是什么readonly如果我想要这个?

Noo*_*ilk 11

没有(基于运行时/环境)的后果.编译器不会吓坏,你的运行时不会爆炸,一切都会好起来的.

它只是FxCop(一些人使用的静态分析工具),对此有警告.警告的原因在您链接的线程中解释(从语义上讲,可能不清楚对象实际上并非"只读",只是该变量无法"重新分配").

就个人而言,我不同意这个规则,所以我只是禁用它(如果你正在运行FxCop并且它与你有关).


Eri*_*ert 8

一个有趣的相关点:可变的只读结构是一个坏主意,因为像这样的情况:

http://ericlippert.com/2008/05/14/mutating-readonly-structs/

我显示此代码的大多数人都无法正确预测其输出.

可变的只读结构有一个问题,人们认为他们正在改变他们,但实际上他们正在改变副本.

可变的只读ref类型具有相反的问题.人们认为它们是不可改变的,但实际上它们只是浅薄不可变的.


Jon*_*eet 7

我认为关键在于它可能会产生误导 - 一个粗心的读者可能会认为一个只读变量实际上是一个常数,它不会.

我会把它当作一个建议而不是一个规则 - 有些情况下它可能是合理的,但应谨慎使用.(特别是,如果可变状态暴露给外界,我会感到紧张.)