Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

10.5.2Поля только для чтения

Если объявление_поля включает модификатор readonly, поля, введенные этим объявлением, являются полями только для чтения. Прямые присваивания полям только для чтения могут быть только как часть этого объявления или в конструкторе экземпляров, либо в статическом конструкторе в этом же классе (присваивание полям только для чтения в этих контекстах можно делать многократно). А именно, прямые присваивания полю readonly разрешены только в следующих контекстах:

  • в деклараторе_переменной, который вводит это поле (включением в объявление инициализатора_переменной);

  • для поля экземпляра в конструкторах экземпляров того класса, который содержит объявление поля; для статического поля в статическом конструкторе того класса, который содержит объявление поля. Это также единственные контексты, в которых допускается передача поля readonly в качестве параметров out или ref.

Попытка присваивания полю readonly или передачи его в качестве параметра out или ref в любом другом контексте является ошибкой времени компиляции.

10.5.2.1Использование статических полей только для чтения вместо констант

Поле static readonly полезно, если требуется символическое имя для значения константы, но тип значения недопустим в объявлении const, или если значение не может быть вычислено во время компиляции. Пример.

public class Color { public static readonly Color Black = new Color(0, 0, 0); public static readonly Color White = new Color(255, 255, 255); public static readonly Color Red = new Color(255, 0, 0); public static readonly Color Green = new Color(0, 255, 0); public static readonly Color Blue = new Color(0, 0, 255);

private byte red, green, blue;

public Color(byte r, byte g, byte b) { red = r; green = g; blue = b; } }

В этом примере члены Black, White, Red, Green и Blue нельзя объявить как const, так как их значения нельзя вычислить во время компиляции. Зато объявление их как static readonly имеет почти такой же результат.

10.5.2.2Отслеживание версий констант и статических полей только для чтения

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

using System;

namespace Program1 { public class Utils { public static readonly int X = 1; } }

namespace Program2 { class Test { static void Main() { Console.WriteLine(Program1.Utils.X); } } }

Пространства имен Program1 и Program2 обозначают две программы, компилируемые отдельно. Поскольку Program1.Utils.X объявлено как статическое поле только для чтения, выходное значение оператора Console.WriteLine не известно во время компиляции, но получается во время выполнения. Таким образом, если X изменен и Program1 перекомпилирована, оператор Console.WriteLine выведет новое значение, даже если Program2 не перекомпилирована. Но если бы X был константой, значение X было бы получено при компиляции Program2 и осталось бы независимым от изменений в Program1 до перекомпиляции Program2.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]