Подтвердить что ты не робот

Объявление строков public static readonly против public const против public static const

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

Пример объявления класса:

internal sealed class ClassName
internal static class ClassName
public sealed class ClassName
public static class ClassName
internal class ClassName

Пример объявления строки:

internal const string stringName
internal static string stringName
public static readonly string stringName
public static string stringName
public const string stringName

Я не понимаю, каковы последствия производительности между различными объявлениями. Есть ли наилучшая практика для этой ситуации/сценария?

4b9b3361

Ответ 1

Я не понимаю, что последствия производительности между различными объявлениями

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

То, о чем вы должны беспокоиться, - это семантика, а не производительность. Вопрос сводится к "readonly, constant или none?"

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

Поле readonly похоже на номер версии. Он изменяется со временем, но не изменяется при выполнении программы. Константа - это что-то вроде pi или атомного номера свинца; он фиксирован, вечен, никогда не меняется. Обычное поле полезно для чего-то, что меняется в ходе программы, например, цены на золото. Каков ваш запрос? Будет ли он постоянным на протяжении всей программы, постоянным на все время или не постоянным вообще?

Ответ 2

Вам следует выбрать модификатор доступа (public или internal) на основе того, какой код использует строки.

  • static const - ошибка компилятора.

  • Поле A static readonly - это нормальное поле, которое не может быть установлено после статического ctor.

  • A const string будет заменено его буквальным значением во время компиляции.
    Следовательно, это даст немного лучшую производительность (поскольку среда выполнения не использует это поле).
    Однако, поскольку он был заменен во время компиляции, любые изменения в определении в одной сборке не будут собраны другими сборками, пока они не будут повторно перекомпилированы.

Если ваш код используется только в одной сборке, вы можете использовать строки const.
Однако, если ваши строки используются другими сборками (или могут быть в будущем), вы должны использовать строки static readonly для удобства обслуживания.

Также обратите внимание, что строка const - это константа времени компиляции.
Если вам нужно включить такие вещи, как имя машины или имя пользователя в строке, вам нужно сделать это static readonly.

Ответ 3

On const vs static readonly:
const может иметь лучшую производительность, поскольку это константа compiletime
Но, с другой стороны, у него есть проблемы с двоичным версированием. Константа встраивается в сборку, которая ее использует, поэтому, если сборка, объявляющая ее, изменяется, другая сборка должна быть перекомпилирована или будет использоваться устаревшая константа.

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

Ответ 4

По скорости разница между общедоступной статической строкой и открытой строкой const незначительна.

В IL это разница между

ldsfld someaddr.field 

и

ldstr "your const here"

Вот ответ, хотя. Используя const, вы буквально заставляете свою сборку использовать этот литерал каждый раз, когда используете его, поэтому сборка будет проходить с этими литералами. Со статическими будут "указатели" в центральное место.

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

Итак, я беру на себя следующее: если вам нужно использовать переключатель - вы должны использовать use const; если вы этого не сделаете - я бы пошел со статикой.

НТН

Николай