Pull to refresh

Немного о модификаторе readonly

Совсем недавно я начал изучать С#. Как и любому новичку, при знакомстве с материалом что-то было непонятно. Особый интерес привлек модификатор языка readonly.

Из описания в MSDN:
Ключевое слово readonly — это модификатор, который можно использовать для полей. Если объявление поля содержит модификатор readonly, присвоение значений таким полям может происходить только как часть объявления или в конструкторе в том же классе.

Там же приводится пример использования данного модификатора. Все как бы хорошо, однако, данный пример приведен для типов значений, для ссылочных типов никаких пояснений не приводится.
В одной из книг приводился пример:

public class DocumentManager
{
private readonly Queue<Document> documentQueue = new Queue<Document>();
public void AddDocument(Document doc)
{
lock (this)
{
documentQueue.Enqueue(doc);
}
}
public Document GetDocument()
{
Document doc = null;
lock (this)
{
doc = documentQueue.Dequeue();
}
return doc;
}

Данный кусок кода вызвал у меня определенное замешательство. Объект documentQueue объявлен как readonly, так каким же образом мы можем добавлять в него элементы? Я предположил, что, возможно, элементы данного объекта становятся readonly. Я написал аналогичный класс, но с использованием List. К моему удивлению, элементы изменялись без каких-либо трудностей.

Тогда я создал еще один объект Queue documentQueue2 и попробовал присвоить значение documentQueue( documentQueue=documentQueue2). И только в этом случае IntelieSense показала ошибку, что нельзя присвоить значение полю доступному только для чтения.

Таким образом, для ссылочных типов модификатор доступа readonly применяется к ссылке — ее нельзя будет изменить в будущем. Публичные же свойства, объекта ссылочного типа, остаются доступными для изменения.
Надеюсь, данная статья поможет таким же новичкам как и я быстрее освоить изучаемый язык.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.