чем отличаются константы и доступные только для чтения поля

Чем отличаются константы и доступные только для чтения поля

чем отличаются константы и доступные только для чтения поля. Смотреть фото чем отличаются константы и доступные только для чтения поля. Смотреть картинку чем отличаются константы и доступные только для чтения поля. Картинка про чем отличаются константы и доступные только для чтения поля. Фото чем отличаются константы и доступные только для чтения поля

Как с помощью констант так и с помощью полей только для чтения (readonly fields) можно добиться одной и той же цели — инициализировать поле обьекта при его создании неким значением, которое гарантированно не будет изменено при дальнейшей жизни этого обьекта. Но эти два способа сильно отличаются друг от друга. В этой статье я попытаюсь доступно рассказать про эти отличия.

Статичность

Константы являются не явно статическими и вы не можете обьявить их с ключевым словом static — вы получите ошибку компилятора.
В отличие от констант, поля для чтения не являются неявно статическими, и если вы хотите сделать их таковыми, то ключевое слово static нужно добавлять вручную.
Это позволяет сделать вывод, что константы являются неизменяемыми только на уровне типа, в то время как поля только для чтения могут быть неизменными как на уровне типа так и на уровне конкретного объекта. Пример кода ниже демонстрирует сказанное:

Момент задания значения

Значение константы должно быть задано в момент ее определения в классе. Поле только для чтения должно быть определено до завершения работы конструктора. Это означает что вы можете задать значение такого поля как непосредственно в строке его определения ( inline инициализация), так и в теле конструктора.

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

Проблема версий

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

Используя поля только для чтения можно избежать проблемы версий, и сделать возможным обновление значения без перекомпиляции всех сборок-пользователей. Но чтобы это было возможно, нужно чтобы сборка определяющуя поле не имела строгое имя, а политика версий приложения была таковой, что CLR загрузит эту новую версию сборки.

Типы полей

Константы могут иметь только такие типы, которые ваш компилятор воспринимает как примитивные. В C# следующие типы являются примитивными и могут быть использованы для определения констант: Boolean, Char, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64,UInt64, Single, Double, Decimal, и String. Тем не менее, C# также позволяет определить константу не примитивного типа, но при условии, что ей будет присвоено значение null.

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

Источник

Константы и поля только для чтения

Дата изменения: 11.09.2017

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

Если необходимо, чтобы значение переменной не изменялось – нужно применять константы и поля только для чтения.

Значение константы (const) устанавливается один раз – в момент объявления поля в типе (классе или структуре). Ни конструктор, ни методы класса не могут менять значения константы. Поле только для чтения инициализируется внутри типа и конструктором.

Константы: объявление и инициализация

Чтобы объявить поле константным необходимо перед именем поля прописать модификатор const в блоке типа, вот так:

Константы, по своей сути – не переменные, но члены типа. Если Вы объявите поле константным в родительском классе, который поместите в отдельной библиотеке(dll). Затем, создадите производные классы, в которых появится необходимость изменить значение на другое, то ничего не получится – придется изменять код dll. Поэтому применять константы нужно только, если есть уверенностью в том, что их значения никогда не изменятся.

В объявлении константы инициализация обязательна. Допустимо применять модификаторы доступа к константам, вот так:

Нельзя объявлять константу статической (не применим модификатор static):

выражение static const – тавтология C#, нельзя сделать статичное еще более статичным.

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

Поля только для чтения (readonly) похожи на константные тем, что им можно присвоить значение только один раз. Объявляются с помощью ключевого слова readonly перед типом поля:

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

Поля только для чтения поддерживают все модификаторы доступа (private, public, protected, internal).

Доступ к константам и полям только для чтения

Осуществляется через селектор члена класса(.), для констант – через имя типа, для полей только для чтения – через имя объекта типа:

Технически поля для чтения и константы – неизменяемые поля. Но константа создается компилятором во время компиляции, а поле для чтения во время выполнения.

Поэтому в отличии от констант при определении полей только для чтения допускается применение модификатора static, аполе readonly можно использовать для констант времени выполнения:

Это удобно для фиксации системного времени событий в неизменяемом поле.

Источник

Const C# | Константы C# и readonly C# переменные

Константа — прекрасное греческое слово, обозначающее постоянство. Каким же боком это относится к программированию? Итак, предположим, нам нужно одна или несколько постоянных, которые ни при каких сценариях не должны меняться. Как вы понимаете, простая переменная в данном случае не подойдет, ведь её значение может быть изменено. Поэтому нам нужно рассмотреть константы C# и чем они отличаются от переменных только для чтения readonly C#.

Константы — const C#

К примеру мы пишем программу для вычисления параметров окружности. Есть множество значений, которые должны быть неизменными. Например математическая константа pi = 3.14. Рассмотрим реализацию простейшего калькулятора.

При попытке изменить значение переменной pi мы получим ошибку. Это и является главной особенностью констант.

Переменные только для чтения — readonly C#

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

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

Где можно это использовать? Да в любом месте, где по вашему мнению значение переменной не должно меняться в ходе работы программы. При этом важно не забывать различия между const и readonly.

Пожалуй, вот и все, что следует знать по данной теме. Удачных вам экспериментов, коллеги.

Также рекомендую ознакомиться со статьей Циклы в языке программирования C#. А также подписывайтесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для программистов.

Источник

В чем разница между const и readonly?

в чем разница между const и readonly и вы используете один над другим?

30 ответов

кроме кажущейся разницы

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

есть gotcha с запорами! Если вы ссылаетесь на константу из другой сборки, ее значение будет скомпилировано прямо в вызывающую сборку. Таким образом, при обновлении константы в указанной сборке она не изменится в вызывающей сборке!

константы

только для чтения полей экземпляра

статические поля только для чтения

просто добавить, ReadOnly для ссылочных типов только делает ссылку readonly не значения. Например:

Это все объясняет. Сводка: const должен быть инициализирован во время объявления, readonly может быть инициализирован на конструкторе (и, таким образом, иметь другое значение в зависимости от используемого конструктора).

редактировать: см. попался Гишу выше на тонкую разницу

const : не может быть изменен нигде.

readonly : это значение может быть изменено только в конструкторе. Невозможно изменить нормальные функции.

есть небольшая gotcha с readonly. Поле readonly может быть установлено несколько раз в конструкторе(конструкторах). Даже если значение задано в двух разных цепных конструкторах, оно все равно разрешено.

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

A readonly член подобен константе в том, что он представляет собой неизменное значение. Разница в том, что readonly элемент может быть инициализирован во время выполнения, в конструкторе, а также может быть инициализирован так, как они есть объявленный.

const

только для чтения

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

Эрик Липперт команды C# имеет больше информации о различных типах неизменности

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

резюме:

еще один gotcha: readonly значения могут быть изменены «окольным» кодом через отражение.

Только Для Чтения : Значение может быть изменено через Ctor во время выполнения. Но не через функцию-член

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

Я считаю const значение одинаково для всех объектов (и должно быть инициализировано литеральным выражением), тогда как readonly может отличаться для каждого экземпляра.

один из членов команды в нашем офисе предоставил следующие рекомендации по использованию const, static и readonly:

последнее примечание: поле const является статическим, но обратное неверно.

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

переменные, отмеченные const, немного больше, чем строго типизированные макросы #define, во время компиляции ссылки на переменные const заменяются встроенными литеральными значениями. Как следствие, таким образом можно использовать только некоторые встроенные примитивные типы значений. Переменные, отмеченные только для чтения, могут быть установлены в конструкторе во время выполнения, и их только для чтения также применяется во время выполнения. С этим связана небольшая стоимость производительности, но это означает, что вы можете использовать readonly с любым типом (даже ссылочный тип.)

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

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

на только для чтения ключевое слово отличается от const ключевое слово. А const поле может быть инициализировано только в декларация поля. А только для чтения поле может быть инициализировано либо в декларация или конструктор. Следовательно,только для чтения поля могут иметь разные значения в зависимости от используемого конструктора. Кроме того, в то время как const поле-это времени компиляции константа,только для чтения поле можно использовать для время работы константы, как в следующем примере:

Поскольку const действительно работает только с базовыми типами данных, если вы хотите работать с классом, вы можете чувствовать себя «вынужденным» использовать только чтение. Однако остерегайтесь ловушки! ReadOnly означает, что вы не можете заменить объект другим объектом (вы не можете заставить его ссылаться на другой объект). Но любой процесс, который имеет ссылку на объект, может свободно изменять значения внутри объект!

существует заметная разница между полями const и readonly в C#.Net

const по умолчанию статичен и должен быть инициализирован с постоянным значением, которое не может быть изменено позже. Изменение значения также не допускается в конструкторах. Его нельзя использовать со всеми типами данных. Для ex-DateTime. Его нельзя использовать с типом данных DateTime.

затем поле readonly может быть инициализировано мгновенными конкретными значениями следующим образом:

здесь экземпляр objOne будет иметь значение поля readonly как 5, а objTwo имеет 10. Что невозможно с помощью const.

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

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

постоянный

нам нужно предоставить значение в поле const, когда оно определено. Затем компилятор сохраняет значение константы в метаданных сборки. Это означает, что константа может быть определена только для примитивного типа типа boolean, char, byte и так далее. Константы всегда считаются статическими членами, а не членами экземпляра.

только для чтения

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

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

A const должен быть жестко, где readonly может быть задаются в конструкторе класса.

Const и readonly похожи, но они не совсем то же самое. Поле const является константой времени компиляции, что означает, что это значение может быть вычислено во время компиляции. Поле только для чтения включает дополнительные сценарии, в которых некоторый код должен выполняться во время построения типа. После построения поле readonly изменить нельзя.

например, члены const можно использовать для определения таких членов, как:

поскольку такие значения, как 3.14 и 0, являются временем компиляции константы. Однако рассмотрим случай, когда вы определяете тип и хотите предоставить некоторые его экземпляры pre-fab. Например, возможно, вы захотите определить класс цвета и предоставить «константы» для общих цветов, таких как черный, белый и т. д. Это невозможно сделать с членами const, так как правые стороны не являются константами времени компиляции. Это можно сделать с регулярными статическими членами:

но тогда нет ничего, чтобы удержать клиента цвета от того, чтобы с ним возиться, возможно, путем замены черно-белые значения. Излишне говорить,что это вызовет ужас для других клиентов класса Color. Функция «только чтение» обращается к этому сценарию. Просто введя ключевое слово readonly в объявлениях, мы сохраняем гибкую инициализацию, предотвращая клиентский код от возни.

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

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

и другой разработчик написал код, который опирался на:

теперь, может ли генерируемый код полагаться на тот факт, что A. C является константой времени компиляции? То есть, может ли использование A. C просто быть заменено значение 0? Если вы скажете » да » на это, то это означает, что разработчик A не может изменить способ инициализации A. C-это связывает руки разработчика A без разрешения. Если вы скажете » нет » на этот вопрос, то важная оптимизация будет пропущена. Возможно, автор A уверен, что A. C всегда будет равен нулю. Использование как const, так и readonly позволяет разработчику A указать намерение. Это позволяет улучшить поведение управления версиями, а также повысить производительность.

Источник

Русские Блоги

Разница между const, static и readonly в C #

1. Введение в const и только для чтения

①【constИзмененная переменная может быть инициализирована только путем присваивания, когда она объявлена.

②【ReadonlyЭто переменная только для чтения, и ее можно инициализировать в объявлении или конструкторе.

③ Резюме:

«1» В зависимости от используемого конструктора поле readonly может иметь разные значения.

«2» Для результата каждой компиляции значение const является фиксированным, а значение readonly может быть определено во время выполнения.

④ 10 различий между const (constant) и readonly

чем отличаются константы и доступные только для чтения поля. Смотреть фото чем отличаются константы и доступные только для чтения поля. Смотреть картинку чем отличаются константы и доступные только для чтения поля. Картинка про чем отличаются константы и доступные только для чтения поля. Фото чем отличаются константы и доступные только для чтения поля

⑤const пример:

Под постоянные поля память не выделяется; Когда тыПри определении постоянного поля его значение должно быть присвоено при объявлении, и тогда мы не можем изменить его значение.

[Const int methodValue = GetTestValue (); // Неправильно] потому, что объявлена ​​константа переменной (methodValue), пытаясь использовать возвращаемое значение метода GetTestValue () во время выполнения, это не будет выполнено из-за постоянной переменной The значение должно быть присвоено при объявлении и не может быть изменено динамически.

Примечание. Поскольку мы используем статическую постоянную переменную по умолчанию, мы не можем получить к ней доступ из экземпляра класса. Таким образом, мы не можем передавать значения const в качестве параметров ref или out.

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

Поле только для чтения принадлежит объекту класса и может быть инициализировано в объявлении или конструкторе.

Два, константное и статическое введение

① [static] определяет статическую переменную, и ее значение может быть изменено извне.

② const и static нельзя использовать вместе.

③ Существенная разница между ними:

《1》constЗначение определяется во время компиляции, поэтому его значение может быть указано только константным выражением во время объявления.

《2》И static, только для чтения вычисляет свое значение во время выполнения, поэтому его также можно назначить через статический конструктор.

Использование статики в многопоточности

Члены категории «1» делятся на две категории:Статический член (Статические члены принадлежат классу)сЧлен экземпляра (Члены экземпляра принадлежат объектам, то есть экземплярам классов)

«2» кратко обсудите использование в классеСтатическое полесСтатический методБудут ли проблемы с безопасностью потоков. К

1, мы знаем,Вызов статического поля и статического метода осуществляется через классСтатические методы не работают с конкретными экземплярами, можно получить доступ только к статическим членам. Методы экземпляра могут работать с конкретными экземплярами и могут обращаться как к статическим членам, так и к членам экземпляра.

2. Затем,Есть ли проблемы с безопасностью потоков при использовании статических методов в многопоточности?ЭтотЗависит от статического методаЭто статический метод, который вызывает проблему безопасности потоков.Используются ли статические члены.

3、Потому что, когда один и тот же статический метод используется в нескольких потоках, каждый поток использует копию своего собственного поля экземпляра и совместно использует статическое поле.так, Если статический метод не управляет статическим членом, внутри метода используется только поле экземпляра, что не вызовет проблем с безопасностью. Однако, если статический метод манипулирует статическим полем, вам необходимо использовать взаимоисключающий доступ в статическом методе для обработки безопасности, как показано в следующем примере.

⑤Для тех мест, которые должны быть постоянными по своей природе, но не могут быть объявлены с помощью const, можно использовать static readonly. Например, пример, приведенный в спецификации C #:

Три, статическое введение только для чтения

① Мы выделяем только статические поля только для чтения в [декларации] или [статическом конструкторе].

Из-заЗначение поля только для чтения различается в зависимости от используемого конструктора.. чтобыЧтобы сделать его членом класса (статическим членом) и единственным классом, мы добавим ключевое слово static перед переменной,Следующее.

② Основное различие между полями только для чтения и статическими полями только для чтения в C #

чем отличаются константы и доступные только для чтения поля. Смотреть фото чем отличаются константы и доступные только для чтения поля. Смотреть картинку чем отличаются константы и доступные только для чтения поля. Картинка про чем отличаются константы и доступные только для чтения поля. Фото чем отличаются константы и доступные только для чтения поля

В-четвертых, когда использовать const, только для чтения, статические только для чтения

② Мы хотим использовать разные постоянные значения для разных экземпляров класса (или объекта), используйте [только для чтения].

③В проекте, сконфигурированном в файле конфигурации проекта (константа инициализируется во время построения класса), константы, которые могут изменяться (например, PI), используйте [static readonly]

Примечание. При использовании статического режима только для чтения избегайте проблемы с версией dll; поскольку в IL встроены постоянные значения, мы можем использовать модификаторы констант для повышения производительности.

Источник

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

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