Модифікатор const можна (і зазвичай варто) застосовувати до будь-якого поля, значення якого відоме під час компіляції і не змінюється протягом часу виконання програми.
private const int num = 1729;
public const string title = "Grand" + " Master";
Модифікатор readonly можна (і зазвичай варто) застосовувати до будь-якого поля, яке не вдається зробити const, значення якого не змінюється протягом часу виконання програми і яке встановлюється або вбудованим ініціалізатором, або під час створення екземпляра (конструктором чи методом, який викликає конструктор).
private readonly int num;
private readonly System.Random rand = new System.Random();
public MyClass(int num)
{
this.num = num;
}
У ситуаціях, чутливих до безпеки (або навіть просто у великій кодовій базі, де розробники мають різні пріоритети й наміри), варто уникати того, щоб публічний API класу можна було обійти, приймаючи й зберігаючи змінні параметри методу або відкриваючи змінний член класу через повернене значення чи як out-параметр.
Хоча модифікатор readonly захищає значення або посилання в полі від перезапису, він не дає жодного захисту для членів типу-посилання.
readonly List<int> ints = new List<int>();
void Foo()
{
ints.Add(1); // ok
ints = new List<int>(); // fails to compile
}
Щоб усі члени типу-посилання були захищені, поля можна зробити readonly, а автоматичні властивості оголосити без засобу доступу set.
Бібліотека базових класів (BCL) надає деякі версії колекцій, доступні лише для читання, коли потрібно зупинити оновлення членів колекції. Вони мають вигляд обгорток:
ReadOnlyDictionary<T> надає Dictionary<T> лише для читання.ReadOnlyCollection<T> надає List<T> лише для читання.Система автентифікації, з якою ми познайомилися у вправі developer-privileges, потребує уваги. Нам доручили навести лад у коді. Такий проєкт із наведення ладу не лише полегшить життя майбутнім супровідникам, а й виявить і виправить кілька вразливостей безпеки.
const
Це завдання з рефакторингу. Додайте модифікатор const до відповідних членів Authenticator або Identity.
readonly
Це завдання з рефакторингу. Додайте модифікатор readonly до відповідних полів класу Authenticator або структури Identity.
Видаліть аксесор set або зробіть його private для відповідних властивостей класу Authenticator чи структури Identity.
Зараз поле з ідентичністю адміністратора повертається викликом Admin. Це не найкращий варіант, адже той, хто викликає, може змінити це поле. Знайдіть спосіб не дати тому, хто викликає, змінювати дані адміністратора в обʼєкті Authenticator.
Зараз словник, який містить жорстко закодовані привілейовані ідентичності розробників, повертається викликом GetDevelopers(). Це не найкращий варіант, адже той, хто викликає, може змінити цей словник. Знайдіть спосіб не дати тому, хто викликає, змінювати дані розробників в обʼєкті Authenticator.
Зареєструйтеся на Exercism, щоб вивчати й опановувати C#, а також 62 концепції178 вправ та справжнє наставництво від людей, і все це безкоштовно.