Read only что это такое
Перейти к содержимому

Read only что это такое

  • автор:

readonly (Справочник по C#)

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

  • В объявлении поля readonly указывает на то, что присвоение значения полю может происходить только при объявлении или в конструкторе этого класса. Полю только для чтения можно несколько раз назначить значения в объявлении поля и в конструкторе. Поле readonly нельзя изменять после выхода из конструктора. Это правило влечет за собой разные последствия для типов значений и ссылочных типов:
    • Так как типы значений непосредственно содержат их данные, поле, которое является типом readonly значения, является неизменяемым.
    • Ссылочные типы содержат только ссылку на соответствующие данные, а значит поле readonly ссылочного типа будет всегда ссылаться на один объект. Но сам этот объект не является неизменяемым. Модификатор readonly запрещает замену поля другим экземпляром ссылочного типа. Но этот модификатор не препятствует изменению данных экземпляра, на которое ссылается поле только для чтения, в том числе через это поле.

    Внешний видимый тип, содержащий внешне видимое поле только для чтения, которое является изменяемым ссылочным типом, может быть уязвимостью безопасности и может вызвать предупреждение CA2104 : «Не объявляйте только изменяемые типы ссылок».

    • ref readonly Объявление параметра методу.

    Пример поля только для чтения

    В этом примере значение поля year нельзя изменить в методе ChangeYear , несмотря на то, что в конструкторе класса ему присваивается значение:

    class Age < private readonly int _year; Age(int year) < _year = year; >void ChangeYear() < //_year = 1967; // Compile error if uncommented. >> 

    Можно присвоить значение полю readonly только в следующих контекстах:

      Когда переменная инициализируется в объявлении, например:

    public readonly int y = 5; 

    Эти контексты конструктора являются единственными, в которых можно передавать поле readonly в качестве параметра out или ref.

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

    public static readonly uint timeStamp = (uint)DateTime.Now.Ticks; 
    public class SamplePoint < public int x; // Initialize a readonly field public readonly int y = 25; public readonly int z; public SamplePoint() < // Initialize a readonly instance field z = 24; >public SamplePoint(int p1, int p2, int p3) < x = p1; y = p2; z = p3; >public static void Main() < SamplePoint p1 = new SamplePoint(11, 21, 32); // OK Console.WriteLine($"p1: x=, y=, z="); SamplePoint p2 = new SamplePoint(); p2.x = 55; // OK Console.WriteLine($"p2: x=, y=, z="); > /* Output: p1: x=11, y=21, z=32 p2: x=55, y=25, z=24 */ > 

    В предыдущем примере при использовании такого оператора:

    p2.y = 66; // Error 

    будет отображено сообщение об ошибке компилятора:

    Присваивание значений доступному только для чтения полю допускается только в конструкторе и в инициализаторе переменных.

    Члены экземпляров только для чтения

    Модификатор можно также использовать readonly для объявления того, что член экземпляра не изменяет состояние структуры.

    public readonly double Sum()

    Пример возвращаемой ссылки только для чтения

    Модификатор readonly в ref return указывает, что возвращаемую ссылку нельзя изменить. Следующий пример возвращает ссылку на источник. Он использует модификатор readonly , чтобы указать, что вызывающие объекты не могут изменять источник:

    private static readonly SamplePoint s_origin = new SamplePoint(0, 0, 0); public static ref readonly SamplePoint Origin => ref s_origin; 

    Необязательно должен возвращаться тип readonly struct . Любой тип, возвращаемый из ref , может возвращаться из ref readonly .

    Пример возвращаемого значения readonly readonly

    Возврат refonly также можно использовать в сочетании с readonly элементами экземпляра в struct типах:

    public struct ReadonlyRefReadonlyExample < private int _data; public readonly ref readonly int ReadonlyRefReadonly(ref int reference) < // _data = 1; // Compile error if uncommented. return ref reference; >> 

    Метод по сути возвращает ссылку readonly вместе с членом экземпляра (в данном случае методом) readonly (не удается изменить поля экземпляра).

    Спецификация языка C#

    Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

    Вы также можете ознакомиться с предложениями языковых спецификаций:

    • Ссылка и структура readonly
    • Члены структуры readonly

    См. также

    • Добавление модификатора чтения (правило стиля IDE0044)
    • Справочник по C#
    • Руководство по программированию на C#
    • Ключевые слова в C#
    • Модификаторы
    • const
    • Поля

    Совместная работа с нами на GitHub

    Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

    TypeError: «x» is read-only(Ошибка Типа: «x» только для чтения)

    Эта ошибка возникает только в коде строгого режима. В нестрогом коде назначение игнорируется.

    Примеры

    недействительные кейсы

    Свойства только для чтения не очень распространены, но их можно создать с помощью Object.defineProperty() или Object.freeze() .

    "use strict"; var obj = Object.freeze( name: "Elsa", score: 157 >); obj.score = 0; // TypeError ("use strict"); Object.defineProperty(this, "LUNG_COUNT",  value: 2, writable: false >); LUNG_COUNT = 3; // TypeError ("use strict"); var frozenArray = Object.freeze([0, 1, 2]); frozenArray[0]++; // TypeError 

    В JavaScript также встроено несколько свойств, доступных только для чтения. Возможно, вы пытались переопределить математическую константу.

    "use strict"; Math.PI = 4; // TypeError 

    Прости, ты не можешь этого сделать.

    Глобальная переменная undefined также доступна только для чтения, поэтому вы не можете заставить замолчать печально известную ошибку «undefined is not a function:

    "use strict"; undefined = function () >; // TypeError: "undefined" доступен только для чтения 

    Правильные кейсы

    "use strict"; var obj = Object.freeze( name: "Score", points: 157 >); obj =  name: obj.name, points: 0 >; // замена его на новый работающий объект ("use strict"); var LUNG_COUNT = 2; // "var` работает, потому что он не только для чтения LUNG_COUNT = 3; // ok (анатомически маловероятно, хотя) 

    Смотрите также

    • Object.defineProperty()
    • Object.freeze()

    Found a content problem with this page?

    • Edit the page on GitHub.
    • Report the content issue.
    • View the source on GitHub.

    This page was last modified on 7 авг. 2023 г. by MDN contributors.

    Your blueprint for a better internet.

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

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

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

    public class DocumentManager < private readonly QueuedocumentQueue = new Queue(); 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 применяется к ссылке — ее нельзя будет изменить в будущем. Публичные же свойства, объекта ссылочного типа, остаются доступными для изменения.
    Надеюсь, данная статья поможет таким же новичкам как и я быстрее освоить изучаемый язык.

    Что такое файлы «только для чтения» и для чего они используются?

    Ответ: Файлы «только для чтения» («read-only») могут быть открыты, но не могут быть отредактированы. Они обычно используются в качестве шаблонов для создания новых файлов. Так как файлы «только для чтения» не могут быть изменены, они часто выступают в качестве модели или основы для создания нескольких похожих файлов. И Windows и Mac OS X поддерживают файлы «только для чтения».

    ОС Windows

    Чтобы сделать файл «только для чтения» («read-only») в Windows, сперва нужно щелкнуть правой кнопкой мыши по файлу, а затем выбрать пункт «Свойства» («Properties»). Затем в нижней части окна Свойства в разделе «Атрибуты» («Attributes») следует просто установить флажок «Только для чтения» (как показано ниже) и нажать кнопку Применить («Apply»).

    файлы с read only

    Как только свойство файла установлено как «только для чтения», его нельзя перезаписать. Хотя, открыв файл, можно сохранить его с другим именем файла. Открытие файла только для чтения похоже на использование функции «Открыть как копию» («Open as a copy»), которую предлагают некоторые программы. Однако, в отличие от открытия файла с признаком «только для чтения», функция «Открыть как копию» создает копию файла при его открытии, а не при его сохранении.

    Примечание: Если попытаться отредактировать и сохранить файл с атрибутом «только для чтения», то появится ошибка при сохранении «Не удается создать файл (путь к файлу). Проверьте правильность пути и имени файла.»

    Mac OS X

    Пользователи ОС Mac также могут создавать документы «только для чтения». Чтобы сделать файл «только для чтения» в Mac OS X, нужно щелкнуть правой кнопкой мыши (или Control-клик) по файлу и затем выбрать пункт меню «Получение информации» («Get Info»). В верхней части Информационного окна имеется флажок «Блокнот» («Stationery Pad») (см. ниже). Установка этого флажка, преобразует файл в шаблон «только для чтения». Всякий раз, когда открывается файл с установленным флажком «Блокнот», создается копия файла.

    Опции «Блокнот» в Mac OS X служат полезным средством создания нескольких похожих документов на основе одного стандартного документа. Тем не менее, «блокноты» могут быть перезаписаны, если файл с таким же именем сохраняется на документ-«блокнот». Таким образом, рекомендуется для хранения документов-«блокнотов» использовать отдельный каталог, в котором не хранить редактируемые документы.

    В Mac OS X для предотвращения от случайного удаления важных документы или заменены их новыми документами, пользователи могут выбрать флажок «Заблокированные» («Locked») в Информационном окно файла (см. выше).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *