Это:
public MyClass
{
public const string SomeString = "SomeValue";
}
хуже чем это:
public MyClass
{
public static string SomeString { get{ return "SomeValue";}}
}
На оба можно ссылаться одинаково:
if (someString == MyClass.SomeString)
...
Второй, однако, имеет защиту как собственность. Но действительно ли это лучше, чем const?
Я узнал снова и снова об опасностях наличия общественных полей. Поэтому, когда я увидел некоторый код, использующий эти константы в открытых полях, я сразу же приступил к рефакторингу их в свойствах. Но на полпути мне стало интересно, какая польза от статических свойств по сравнению с константами.
Любые идеи?
Ответы:
В C # это очень плохо по ни одной из причин, упомянутых в этой теме.
Публичные константы в C # запекаются в ссылочных сборках. Это означает, что если у вас есть SomeOtherClass в отдельной сборке, ссылающейся на SomeString в MyClass, CIL, сгенерированный для SomeOtherClass, будет содержать жестко закодированную строку SomeValue.
Если вы собираетесь повторно развернуть dll, которая содержит MyClass, но не SomeOtherClass, и измените const, SomeOtherClass не будет содержать того, что, как вы думаете, будет, - он будет содержать исходное значение.
Если вы на 100% уверены, что это универсальная константа, как Пи, сходите с ума; в противном случае действуйте осторожно.
Вот лучшее объяснение: https://stackoverflow.com/questions/55984/what-is-the-difference-between-const-and-readonly
источник
const
свойством только для чтения.const
запекается в вызывающей сборке, свойство только для чтения - нет.const
в C # онемел. Нам нужна лучшая поддержка для неизменяемых ...Изменение поля в свойство является серьезным изменением. Вы теряете двоичную, исходную и отражательную совместимость.
К тому же:
http://csharpindepth.com/articles/chapter8/propertiesmatter.aspx
Несмотря на это, я не вижу, как это на самом деле влияет на константы (особенно если вам не нужны какие-либо из перечисленных выше функций), если ваш API не изменяется таким образом, что они больше не являются константами.
источник
Опасность открытых полей заключается в том, что они изменчивы и что реализация, лежащая в их основе, может быть изменена.
Когда дело доходит до,
const
это, как правило, не проблема (аналогично общедоступным перечислениям) - если только вы не думаете, что в результатеconst
произойдет изменчивость и что вам понадобится инкапсуляция вокруг средства доступа (скажем, для записи, сколько раз оно просматривалось вверх), вы могли бы также держать это как общественностьconst
.источник
Константа это данные. Свойства подразумевают возможность поведения, когда вы столько «смотрите» на значение.
Поведение объединения (или будущая возможность этого) с постоянными данными совершенно неверно. Для большинства систем это не имеет большого значения, но может.
Допустим, значение равно «PI» и широко используется в расчетах системы. Если оставить это за свойствами, клиентские программисты будут вынуждены защищаться. Они должны присвоить значение в дубликат константы. Если они не дублируются, в следующей версии библиотеки может появиться нежелательное «поведение» за свойством. Поведение свойства (если оно находится в скомпилированной библиотеке) неизвестно. Может быть, он хорошо работает в тесте, но может быть скрытый код, который выполняется, если выполняется специальное условие. Это не преждевременная оптимизация. Специально для системы реального времени жизнь людей зависит.
Клиентские программисты могут даже потерять безопасность константы, поскольку язык может не позволить им присваивать значение свойства в их дублирующую константу.
Кроме того, когда программисты вынуждены присваивать значение вашего свойства своей собственной константе, они фактически аннулируют любое поведение, которое вы надеялись достичь с помощью своего свойства.
Истинные постоянные данные не нуждаются или не хотят инкапсуляции.
источник