Одно тонкое, но решающее различие заключается в том, что consts
оцениваются во время компиляции, тогда как statics
оцениваются во время выполнения. Это оказывает существенное влияние на управление версиями. Например, предположим, что вы пишете:
public const int MaxValue = 100;
Вы компилируете и отправляете свою сборку (сборка А). Затем кто-то пишет сборку (сборка B), которая ссылается на MaxValue. В этом случае значение 100 скомпилируется как в их сборку, так и в вашу.
Если вы написали это:
public static readonly int MaxValue = 100;
, то ссылка в их сборке осталась бы такой , ссылка. Когда кто-то выполнил сборку B, значение 100 будет загружено из сборки , сборка A.
Это может, например, повлиять на простые сценарии исправления. Если вы выпустили обновленную сборку A, где MaxValues объявлено как 200, и пользователь копирует эту версию по сравнению с предыдущей версией (но не перекомпилирует сборку B), то в первом сценарии Assembly B будет продолжать работать так, как если бы MaxValues составляли 100, потому что это значение const
, которое было скомпилировано в сборку B. Во втором сценарии Assembly B получит новое значение, потому что оно загружает переменную non-const static
во время выполнения.