private const против public readonly - PullRequest
       37

private const против public readonly

4 голосов
/ 25 августа 2011

Я получил три файла классов, в которых константа объявлена ​​как

private const string PAGE_SIZE = "PageSize";

Это хорошо, чтобы переместить это в новый файл, чтобы хранить все общие константы, объявленные как

public readonly string PageSize = "PageSize";

Какие плюсы и минусы для этого?

Ответы [ 4 ]

5 голосов
/ 25 августа 2011

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

  1. const вычисляется во время компиляции. Если вы объявите const в отдельной сборке, на которую ссылаетесь из вашего приложения, изменение const повлияет на приложение, только если оно будет перекомпилировано с использованием обновленной сборки. Цитировать .NET Руководство по разработке библиотек классов :

    Используйте константные поля для констант, которые никогда не изменятся.

    Например, класс Math определяет E и PI как статические константы.

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

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

Относительно вашего конкретного вопроса, это действительно зависит от того, как эти константы используются. Очевидно, вы не должны иметь несколько определений одной и той же константы. В противном случае, вероятно, легче понять, если константа объявлена ​​«рядом» с тем местом, где она используется, например, в классе или даже в методе, где он используется.

1 голос
/ 25 августа 2011

Помимо соображений производительности -

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

  • Против: ваши константы больше не находятся близко к точке, в которой они используются.

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

0 голосов
/ 25 августа 2011

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

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

0 голосов
/ 25 августа 2011

Возможно, вы слишком рано оптимизируете.

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

Что, если PageSize действительно потребуется изменить между ними в будущем?Нужно ли его синхронизировать во всех трех классах, или это просто небольшая настройка, которая на данный момент кажется хорошей идеей?

...