Статическое чтение только против const - PullRequest
1306 голосов
/ 16 апреля 2009

Я прочитал около const и static readonly полей. У нас есть несколько классов, которые содержат только постоянные значения. Используется для различных вещей в нашей системе. Так что мне интересно, если мои наблюдения верны:

Должны ли такие постоянные значения всегда быть static readonly для всего, что является публичным? И использовать только const для внутренних / защищенных / личных значений?

Что вы рекомендуете? Должен ли я даже не использовать static readonly поля, а использовать свойства, может быть?

Ответы [ 15 ]

6 голосов
/ 07 апреля 2015

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

Например, предположим, что сборка X предоставляет константу следующим образом:

public const decimal ProgramVersion = 2.3;

Если сборка Y ссылается на X и использует эту константу, значение 2,3 будет запечен в сборке Y при компиляции. Это означает, что если X позже перекомпилируется с константой, установленной на 2,4, Y будет по-прежнему используйте старое значение 2,3, пока Y не будет перекомпилировано. Статический Поле readonly позволяет избежать этой проблемы.

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

3 голосов
/ 11 декабря 2013

Const:

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

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

  1. значение может быть указано при объявлении или во время выполнения с использованием конструкторов. Значение может варьироваться в зависимости от используемого конструктора.
  2. постоянная времени выполнения
2 голосов
/ 27 сентября 2018

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

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

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

static readonly будет лучшим выбором, если мы будем использовать переменные в разных сборках. Пожалуйста, проверьте полную информацию в ссылке ниже

https://www.stum.de/2009/01/14/const-strings-a-very-convenient-way-to-shoot-yourself-in-the-foot/

2 голосов
/ 15 декабря 2014

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

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

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

public const DateTime dt = DateTime.Today;  //throws compilation error
public const string Name = string.Empty;    //throws compilation error
public static readonly string Name = string.Empty; //No error, legal

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

0 голосов
/ 22 ноября 2016

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

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

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

Они не могут быть изменены после инициализации в условиях, указанных выше.

Статический режим «только для чтения» для меня звучит как неудачный выбор, поскольку, если он статический и никогда не меняется, просто используйте его public const, если он может измениться, то он не является константой, а затем, в зависимости от ваших потребностей, вы можете либо используйте только для чтения, либо просто обычную переменную.

Также еще одно важное отличие состоит в том, что константа принадлежит классу, а переменная только для чтения принадлежит экземпляру!

...