У C #, яка різниця між
static readonly string MyStr;
і
const string MyStr;
?
У C #, яка різниця між
static readonly string MyStr;
і
const string MyStr;
?
Відповіді:
Коли ви використовуєте constрядок, компілятор вкладає значення рядка під час компіляції .
Отже, якщо ви використовуєте constзначення для іншої збірки, то оновіть початкову збірку та змініть значення, інша збірка не побачить зміни, поки ви не скомпілюєте її.
static readonlyРядок є нормальним полем , яке отримує подивилося під час виконання. Тому, якщо значення поля буде змінено в іншій збірці, зміни будуть помічені, як тільки збірка буде завантажена, без перекомпіляції.
Це також означає, що static readonlyрядок може використовувати непостійні члени, такі як Environment.UserNameабо DateTime.Now.ToString(). constРядок може бути инициализирована тільки з використанням інших констант або літералів.
Також static readonlyв статичний конструктор може бути встановлений рядок; constрядок може бути тільки инициализирован рядной.
Зауважте, що a static stringможе бути змінено; ви повинні використовувати static readonlyзамість цього.
constслід використовувати тільки для констант - константи бути значення , які ніколи , ніколи , ніколи НЕ зміниться.
private constдля значень, які, власне, не є константами; в основному це неправильне використання constдля цілей мікрооптимізації. Я буду стояти за своїм твердженням "ніколи, ніколи" , навіть якщо це робить мене лицеміром. ;)
Ось хороша розбивка плюсів і мінусів :
Отже, виявляється, що константи слід використовувати, коли малоймовірно, що значення коли-небудь зміниться, або якщо жодні зовнішні програми / libs не будуть використовувати константу. Статичні поля для читання тільки повинні використовуватися, коли потрібен розрахунок часу виконання або якщо зовнішні споживачі є фактором.
constpublic const string MyStr;
- константа часу компіляції (ви можете використовувати її як параметр за замовчуванням, наприклад, для параметра методу), і вона не буде заплутана, якщо ви використовуєте таку технологію
static readonlypublic static readonly string MyStr;
є постійною тривалістю виконання . Це означає, що вона оцінюється при запуску програми, а не раніше. Ось чому він не може використовуватися як параметр за замовчуванням, наприклад, для методу (помилка компіляції). Значення, що зберігається в ньому, може бути прихованим.
OQ запитав про static stringпроти const. Обидва мають різні випадки використання (хоча обидва трактуються як статичні).
Використовуйте const тільки для дійсно постійних значень (наприклад, швидкість світла - але навіть це змінюється залежно від середовища). Причиною цієї суворої настанови є те, що значення const замінено на використання const у збірках, на які посилається, це означає, що ви можете мати проблеми з версією, якщо const зміниться у місці його визначення (тобто воно не повинно бути постійним після всього). Зверніть увагу, це впливає навіть на private constполя, оскільки у вас можуть бути базовий і підклас у різних збірках, а приватні поля успадковуються .
Статичні поля прив’язуються до типу, про який вони декларуються. Вони використовуються для представлення значень, які повинні бути однаковими для всіх примірників даного типу. Ці поля можна записати стільки разів, скільки вам подобається (якщо не вказано лише для читання).
Якщо ви мали на увазі static readonlyпроти const, то я б рекомендував static readonlyмайже для всіх випадків, оскільки це більше докази в майбутньому.
Ви можете змінити значення static readonly stringлише в staticконструкторі класу або змінному ініціалізаторі, тоді як значення constрядка не можна змінити ніде.