только для чтения означает, что вы не можете изменить эталонную пост-конструкцию.
Официальная позиция FXCop заключается в том, что она рекомендует объявлять только типы, которые нельзя изменить readonly
. Поэтому что-то вроде string
хорошо, потому что значение объекта не может быть изменено. Однако значение StringBuilder
может быть изменено, но если сделать его доступным только для чтения, вы не сможете назначить поле другому экземпляру StringBuilder
или null
после запуска конструктора.
Я не согласен с FXCop по этому правилу. Пока кто-то понимает, что это просто принуждение о том, что ссылка не может изменить пост-конструкцию, нет никакой путаницы.
Обратите внимание, что типы значений становятся неизменяемыми с помощью ключевого слова readonly
, а ссылочные типы - нет.
namespace SecurityLibrary
{
public class MutableReferenceTypes
{
static protected readonly StringBuilder SomeStringBuilder;
static MutableReferenceTypes()
{
// allowed
SomeStringBuilder = new StringBuilder();
}
void Foo()
{
// not allowed
SomeStringBuilder = new StringBuilder();
}
void Bar()
{
// allowed but FXCop doesn't like this
SomeStringBuilder.AppendLine("Bar");
}
}
}