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

в 16:02, , рубрики: Песочница

Совсем недавно я начал изучать С#. Как и любому новичку, при знакомстве с материалом что-то было непонятно. Особый интерес привлек модификатор языка 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 применяется к ссылке — ее нельзя будет изменить в будущем. Публичные же свойства, объекта ссылочного типа, остаются доступными для изменения.
Надеюсь, данная статья поможет таким же новичкам как и я быстрее освоить изучаемый язык.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js