Объявление строк public static readonly против public const против public static const - PullRequest
34 голосов
/ 09 декабря 2010

В каждом нашем проекте есть файл, используемый для хранения различных операторов 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

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

Ответы [ 5 ]

80 голосов
/ 10 декабря 2010

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

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

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

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

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

9 голосов
/ 09 декабря 2010

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

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

  • Поле static readonly является нормальным полем, которое нельзя установить после статического ctor.

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

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

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

7 голосов
/ 09 декабря 2010

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

3 голосов
/ 09 сентября 2011

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

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

ldsfld someaddr.field 

и

ldstr "your const here"

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

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

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

HTH

Николай

0 голосов
/ 30 января 2018

Учитывая, что вы используете Visual Studio, небольшим преимуществом использования public const над public static readonly является возможность использовать IntelliSense для "пика" при значении const.

например. Дано:

public class Constants
{
     public const string ConstString = "Visible!";
     public static readonly string StaticReadonlyString = "Invisible!";
}

hovering over a string that's a constant hovering over a string variable that's static readonly

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