атрибут read only что это
HTML attribute: readonly
The Boolean readonly attribute, when present, makes the element not mutable, meaning the user can not edit the control.
If the readonly attribute is specified on an input element, because the user can not edit the input, the element does not participate in constraint validation.
form control elements. If present on any of these input types and elements, the :read-only pseudo class will match. If the attribute is not included, the :read-write pseudo class will match.
Note: Only text controls can be made read-only, since for other controls (such as checkboxes and buttons) there is no useful distinction between being read-only and being disabled, so the readonly attribute does not apply.
When an input has the readonly attribute, the :read-only pseudo-class also applies to it. Conversely, inputs that support the readonly attribute but don’t have the attribute set match the :read-write pseudo-class.
Attribute interactions
The difference between disabled and readonly is that read-only controls can still function and are still focusable, whereas disabled controls can not receive focus and are not submitted with the form and generally do not function as controls until they are enabled.
Because a read-only field cannot have it’s value changed by a user interaction, required does not have any effect on inputs with the readonly attribute also specified.
The only way to modify dynamically the value of the readonly attribute is through a script.
Note: The required attribute is not permitted on inputs with the readonly attribute specified.
Usability
Browsers display the readonly attribute.
Constraint validation
If the element is read-only, then the element’s value can not be updated by the user, and does not participate in constraint validation.
readonly (Справочник по C#)
Ключевое слово readonly — это модификатор, который может использоваться в четырех контекстах:
В объявлении поля readonly указывает на то, что присвоение значения полю может происходить только при объявлении или в конструкторе этого класса. Полю только для чтения можно несколько раз назначить значения в объявлении поля и в конструкторе.
Поле readonly нельзя изменять после выхода из конструктора. Это правило влечет за собой разные последствия для типов значений и ссылочных типов:
Видимый извне тип, который содержит видимое извне и доступное только для чтения поле с изменяемым ссылочным типом, может представлять уязвимость и приводить к предупреждению CA2104: Не объявляйте изменяющиеся ссылочные типы только для чтения.
В определении типа readonly struct объект readonly указывает на то, что тип структуры является неизменяемым. Дополнительные сведения см. в описании структуры readonly в статье Типы структур.
В объявлении члена экземпляра в типе структуры readonly указывает на то, что член экземпляра не изменяет состояние структуры. Дополнительные сведения см. в разделе о членах экземпляров readonly в статье Типы структур.
В возврате метода ref readonly модификатор readonly указывает, что метод возвращает ссылку, и записи для этой ссылки не допускаются.
Контексты readonly struct и ref readonly были добавлены в C# 7.2. Члены структуры readonly добавлены в C# 8.0
Пример поля только для чтения
Можно присвоить значение полю readonly только в следующих контекстах:
Когда переменная инициализируется в объявлении, например:
В конструкторе экземпляра класса, содержащего объявление поля экземпляра.
В статическом конструкторе класса, содержащего объявление статического поля.
Эти контексты конструктора являются единственными, в которых можно передавать поле readonly в качестве параметра out или ref.
Ключевое слово readonly отличается от ключевого слова const. Поле const может быть инициализировано только при объявлении поля. Поле readonly может быть назначено несколько раз в объявлении поля и в любом конструкторе. Таким образом, поля readonly могут иметь разные значения в зависимости от использованного конструктора. К тому же, поскольку поле const является константой времени компиляции, поле readonly можно использовать для констант времени выполнения, как в следующем примере:
В предыдущем примере при использовании такого оператора:
будет отображено сообщение об ошибке компилятора:
Присваивание значений доступному только для чтения полю допускается только в конструкторе и в инициализаторе переменных.
Пример возвращаемой ссылки только для чтения
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
Вы также можете ознакомиться с предложениями языковых спецификаций:
Readonly-свойства в PHP 8.1
И сравните с аналогом в PHP 8.0:
Видна огромная разница, хотя я думаю, что есть ещё одна большая проблема: все эти методы чтения. Лично я их больше не использую, начиная с PHP 8.0, в котором добавили определение свойств в конструкторе. Я предпочитаю использовать общедоступные свойства вместо написания методов чтения:
Однако объектно-ориентированным пуристам такой подход не нравится: внутренний статус объекта не должен быть раскрыт напрямую и определённо не может быть изменён извне.
В наших проектах в Spatie есть внутреннее руководство по написанию кода, согласно которому DTO и VO с общедоступными свойствами не должны изменяться извне. Подход, который, кажется, работает вполне неплохо, мы используем его уже довольно давно, не сталкиваясь с какими-либо проблемами.
Однако да, я согласен с тем, что было бы лучше, если бы язык гарантировал, что общедоступные свойства вообще не могут быть переопределены. Что ж, в PHP 8.1 решили эту проблему, добавив ключевое слово readonly :
Как и предполагает его название, смысл ключевого слова в том, что после того, как свойство установлено, его больше нельзя переопределить:
Знание, что когда объект инициализирован, он больше не будет меняться, даёт нам определённый уровень уверенности и спокойствия при написании кода: целый ряд непредвиденных изменений данных просто не может произойти.
Конечно, по-прежнему нужна возможность клонировать объект и, возможно, изменять некоторые свойства в процессе. Далее мы обсудим, как это сделать с readonly-свойствами. Для начала, давайте рассмотрим их подробнее.
Только типизированные свойства
Readonly-свойства могут быть только типизированными:
Однако вы можете использовать тип mixed для указания типа:
Обычные объекты и объекты с определением свойств в конструкторе
Вы уже видели примеры и того и другого: readonly можно добавить как к обычному, так и к свойству, определяемому в конструкторе:
Нет значения по умолчанию
У readonly-свойств не может быть значения по умолчанию:
Точнее, если это не свойство, определяемое в конструкторе:
Причина, по которой это разрешено для свойств, определяемых в конструкторе, заключается в том, что значение по умолчанию в этом случае используется не в качестве значения по умолчанию для свойства класса, а только для аргумента конструктора. Под капотом приведённый выше код будет преобразован в этот:
Посмотрите, как фактическому свойству не присваивается значение по умолчанию. Причина запрета использования значений по умолчанию для readonly-свойств, заключается в том, что в таком виде они ничем не будут отличаться от констант.
Наследование
Нельзя изменять флаг readonly при наследовании:
Правило действует в обоих направлениях: вам не разрешено добавлять или удалять флаг readonly при наследовании.
Unset не допускается
После того как readonly-свойство установлено, вы не можете его изменить и даже сбросить:
Reflection
Клонирование
Что ж, можно клонировать объекты с изменёнными readonly-свойствами, если полагаться на магию Reflection. Создавая объект без вызова его конструктора (что возможно с помощью Reflection), а затем вручную копируя каждое свойство, иногда перезаписывая значение, вы фактически можете «клонировать» объект и изменить его readonly-свойства.
Для этого я разработал небольшой пакет, вот как он выглядит:
Также я написал специальный пост в блоге, объясняющий всю механику.
Вот и всё, что можно сказать о readonly-свойствах. Я думаю, что это отличная возможность, при работе над проектами со множеством DTO и VO и требующими от вас тщательного управления потоком данных во всем коде. Неизменяемые объекты с readonly-свойствами очень в этом помогут.
Немного о модификаторе readonly
Ключевое слово readonly — это модификатор, который можно использовать для полей. Если объявление поля содержит модификатор readonly, присвоение значений таким полям может происходить только как часть объявления или в конструкторе в том же классе.
Там же приводится пример использования данного модификатора. Все как бы хорошо, однако, данный пример приведен для типов значений, для ссылочных типов никаких пояснений не приводится.
В одной из книг приводился пример:
Данный кусок кода вызвал у меня определенное замешательство. Объект documentQueue объявлен как readonly, так каким же образом мы можем добавлять в него элементы? Я предположил, что, возможно, элементы данного объекта становятся readonly. Я написал аналогичный класс, но с использованием List. К моему удивлению, элементы изменялись без каких-либо трудностей.
Тогда я создал еще один объект Queue documentQueue2 и попробовал присвоить значение documentQueue( documentQueue=documentQueue2). И только в этом случае IntelieSense показала ошибку, что нельзя присвоить значение полю доступному только для чтения.
Таким образом, для ссылочных типов модификатор доступа readonly применяется к ссылке — ее нельзя будет изменить в будущем. Публичные же свойства, объекта ссылочного типа, остаются доступными для изменения.
Надеюсь, данная статья поможет таким же новичкам как и я быстрее освоить изучаемый язык.
О песочнице
Это «Песочница» — раздел, в который попадают дебютные посты пользователей, желающих стать полноправными участниками сообщества.
Если у вас есть приглашение, отправьте его автору понравившейся публикации — тогда её смогут прочитать и обсудить все остальные пользователи Хабра.
Чтобы исключить предвзятость при оценке, все публикации анонимны, псевдонимы показываются случайным образом.
О модерации
Не надо пропускать:
Можно ли установить флажки HTML только для чтения?
Я думал, что они могли бы быть, но поскольку я не кладу свои деньги туда, где мой рот (так сказать) устанавливает атрибут readonly, на самом деле, похоже, ничего не делает.
Я бы предпочел не использовать Отключено, поскольку я хочу, чтобы отмеченные флажки отправлялись вместе с остальной частью формы, я просто не хочу, чтобы клиент мог изменять их при определенных обстоятельствах.
Вы можете использовать это:
Это работает, потому что возврат false из события click останавливает продолжение цепочки выполнения.
Важно понимать, что READONLY просто запрещает пользователю изменять значение поля, а не взаимодействовать с ним. Например, в флажках вы можете включить или отключить их (таким образом, установив состояние CHECKED), но вы не меняете значение поля.
Если вы не хотите использовать, disabled но все еще хотите отправить значение, как насчет отправки значения в виде скрытого поля и простой печати его содержимого пользователю, когда они не соответствуют критериям редактирования? например
Это флажок, который вы не можете изменить:
Просто добавьте disabled=»disabled» в качестве атрибута.
Изменить, чтобы обратиться к комментариям:
Таким образом, когда флажок установлен на «отключен», он служит только для визуального представления данных, а не на самом деле «связан» с данными. В обратной записи значение скрытого ввода отправляется, когда флажок снят.
Но вы абсолютно ДОЛЖНЫ проверить данные на сервере, чтобы убедиться, что они не были изменены.
другое «простое решение»:
disabled = «disabled» / disabled = true
Это представляет некоторую проблему юзабилити.
Если вы хотите отобразить флажок, но не позволить ему взаимодействовать, тогда зачем тогда даже флажок?
Однако мой подход заключается в том, чтобы использовать отключенный (пользователь ожидает, что отключенный флажок будет недоступен для редактирования, вместо использования JS, чтобы сделать включенный флажок неработающим), и добавьте обработчик отправки формы, используя javascript, который включает флажки прямо перед тем, как форма будет Отправлено. Таким образом, вы публикуете свои значения.
Я использовал это для достижения результатов:
Я случайно заметил решение, данное ниже. Нашел это мое исследование по той же проблеме. Не знаю, кто это опубликовал, но я не сделал это. Он использует jQuery:
Это сделало бы флажки только для чтения, что было бы полезно для показа данных только для чтения клиенту.
Запоздалый ответ, но большинство ответов, кажется, слишком усложняют его.
Насколько я понимаю, ОП в основном хотел:
Необходимо отметить, что:
Следовательно, поскольку readonly атрибут не работает, лучшее решение, не требующее JavaScript, это:
Итак, для установленного флажка:
Для непроверенного флажка:
Большинство текущих ответов имеют одну или несколько из следующих проблем:
Следующее просто и не имеет ни одной из этих проблем.
Оно работает.
будет работать на вас, я использую это
Некоторые ответы здесь кажутся немного окольными, но вот небольшой взлом.
тогда в jquery вы можете выбрать один из двух вариантов:
Опираясь на приведенные выше ответы, при использовании jQuery это может быть хорошим решением для всех входных данных:
Я знаю, что «отключен» не является приемлемым ответом, так как ОП хочет его опубликовать. Однако вам всегда придется проверять значения на стороне сервера ДАЖЕ, если у вас установлена опция только для чтения. Это потому, что вы не можете запретить злоумышленнику публиковать значения с помощью атрибута readonly.
Я предлагаю сохранить исходное значение (на стороне сервера) и отключить его. Затем, когда они отправляют форму, игнорируют любые опубликованные значения и принимают исходные значения, которые вы сохранили.
Это будет выглядеть и вести себя так, как будто это значение только для чтения. И он обрабатывает (игнорирует) сообщения от злоумышленников. Ты убиваешь 2 зайцев одним выстрелом.
Я бы прокомментировал ответ ConroyP, но это требует 50 репутации, которой у меня нет. У меня достаточно репутации, чтобы опубликовать другой ответ. Сожалею.
Проблема с ответом ConroyP заключается в том, что этот флажок становится неизменным, даже не включая его на странице. Хотя Electrons_Ahoy не оговаривает так много, лучшим ответом будет тот, в котором неизменяемый флажок будет выглядеть аналогично, если не совпадает с изменяемым флажком, как в случае, когда применяется атрибут «отключен». Решение, которое учитывает две причины, которые Electrons_Ahoy указывает на нежелание использовать атрибут «disabled», не будет обязательно будет недействительным, поскольку в нем используется атрибут «disabled».
Нет, входные флажки не могут быть прочитаны только.
Но вы можете сделать их только для чтения с JavaScript!
Добавьте этот код в любое время и в любом месте, чтобы сделать флажки доступными только для чтения, как предполагается, и запретите пользователю изменять его каким-либо образом.
Вы можете добавить этот скрипт в любое время после загрузки jQuery.
Это будет работать для динамически добавленных элементов.
Он работает, собирая событие click (которое происходит до события change) для любого элемента на странице, затем проверяет, является ли этот элемент флажком «только для чтения», и, если это так, блокирует изменение.
Есть так много вариантов, чтобы не влиять на производительность страницы.