2010-07-29 3 views
24

Можно создать дубликат:
What are the benefits to marking a field as readonly in C#?Зачем использовать только для чтения в C#

Я всегда использовал только для чтения ключевого слова в C# в ситуациях, когда я знаю, что нужно только установить ссылку одного объекта (например, соединение службы WCF на странице ASP.NET). Помимо простого обеспечения объектов не может быть установлено более одного раза, каковы преимущества использования readonly над стандартной ссылкой, например, частной или частной статикой? Это кажется расплывчатым. Имеются ли последствия для производительности?

ответ

26

Отличия в производительности, я бы сказал, что большое преимущество в том, что вы предоставляете полезную информацию о том, что такое переменная и для чего она используется (изменить: это имеет еще большую ценность, когда кто-то другой берет на себя обслуживание вашего кода ...)

Кроме того, как вы сказали, это не позволяет кому-то переписать то, что вы хотели быть постоянным значением. Я считаю, что это является достаточным основанием для его использования ...

28

readonly существует только для того, чтобы предотвратить случайное или преднамеренное изменение значения переменной после ее установки. Он применяется во время выполнения.

const аналогичен, но применяется во время компиляции. Таким образом, значение должно быть установлено во время создания переменной.

Любой из них может быть объединен с другими модификаторами, такими как public, private, или static.

+0

Я прочитал несколько описаний 'readonly' и твой кажутся разными. Вы уверены, что это правильно? Я парень Java, но из того, что я прочитал, 'readonly' только предотвращает переназначение ссылки вне конструктора или объявления. То, что вы пишете, звучит так же, как «final» от Java. – Vlasec

8

Поле readonly может быть установлено только при инициализации поля или в конструкторе. Это дает значительную выгоду для текущего обслуживания, потому что вы можете быть уверены, что оно было установлено, когда объект был создан и не был изменен на другой объект с тех пор. Нет выгоды от производительности.

Вообще говоря, вы не должны отмечать поле изменяемого типа как прочитанное только потому, что сам объект может быть впоследствии изменен. FxCop определяет для этого правило предупреждения - http://msdn.microsoft.com/en-us/library/ms182302(v=vs.120).aspx

+4

Объект CAN может быть изменен, если он является изменяемым ссылочным типом. Элементы могут быть добавлены в список, указанный только для чтения. –

+2

По этой причине вам не следует объявлять доступные для чтения типы ссылок: http://msdn.microsoft.com/en-us/library/ms182302%28VS.80%29.aspx. Но хороший момент для воспитания. –

+4

@DavidNeale: Знание того, что поле ссылочного типа всегда указывает на один и тот же объект, часто является очень полезной информацией, даже если могут измениться различные свойства объекта.Среди прочего, при любом уровне абстракции намного легче поддерживать безопасность потоков, когда существует только один уровень изменчивости, чем при наличии двух или более (это большая причина. «Список » не является потокобезопасным , даже для сценариев с добавлением, где «T» является ссылочным типом) - он содержит изменяемую ссылку на изменяемый массив. – supercat

2

Ясность цели и использования, по-видимому, является лучшей причиной для использования readonly. Хотя вы можете утверждать, что вы можете оставить запись просто потому, что она еще не защищена и не нужна.

2

Только помните, что в то время как судья не может быть изменен для чтения, если объект является изменяемым состояние объекта может еще быть изменен (т.е. элементы, добавленные в список)

Смежные вопросы