ПРИМЕЧАНИЕ
Несмотря на кажущееся сходство, поля типа readonlyне следует путать с полями типа const,которые рассматриваются далее в этой главе.
Ниже приведен пример применения поля с ключевым словом readonly. // Продемонстрировать применение поля с ключевым словом readonly.
using System;
class MyClass {
public static readonly int SIZE = 10;
class DemoReadOnly {
■ static void Main() {
int[] source = new int[MyClass.SIZE]; int[] target = new int[MyClass.SIZE];
// Присвоить ряд значений элементам массива source, for(int i=0; i < MyClass.SIZE; i++) source[i] = i;
foreach(int i in source)
Console.Write(i + " ");
Console.WriteLine();
// Перенести обращенную копию массива source в массив target. for(int i = MyClass.SIZE-1, j = 0; i > 0; i—, j++) target[j] = source[i];
foreach(int i in target)
Console.Write(i + " ");
Console.WriteLine();
// MyClass.SIZE = 100; // Ошибка!!! He подлежит изменению!
}
}
В данном примере поле MyClass .SIZE инициализируется значением 10. После этого его можно использовать, но не изменять. Для того чтобы убедиться в этом, удалите символы комментария в начале последней строки приведенного выше кода и попробуйте скомпилировать его. В итоге вы получите сообщение об ошибке.
Ключевые слова const и volatile
Ключевое слово, или модификатор, const служит для объявления полей и локальных переменных, которые нельзя изменять. Исходные значения таких полей и переменных должны устанавливаться при их объявлении. Следовательно, переменная с модификатором const, по существу, является константой. Например, в следующей строке кода:
const int i = 10;
создается переменная i типа const и устанавливается ее значение 10. Поле типа const очень похоже на поле типа readonly, но все же между ними есть отличие. Если поле типа readonly можно устанавливать в конструкторе, то поле типа const — нельзя.
Ключевое слово, или модификатор, volatile уведомляет компилятор о том, что значение поля может быть изменено двумя или более параллельно выполняющимися потоками. В этой ситуации одному потоку может быть неизвестно, когда поле было изменено другим потоком. И это очень важно, поскольку компилятор C# будет автоматически выполнять определенную оптимизацию, которая будет иметь результат лишь в том случае, если поле доступно только одному потоку. Для того чтобы подобной оптимизации не подвергалось общедоступное поле, оно объявляется как volatile.
Этим компилятор уведомляется о том, что значение поля типа volatile следует получать всякий раз, когда к нему осуществляется доступ.
Оператор using
Помимо рассматривавшейся ранее директивы using, имеется вторая форма ключевого слова using в виде оператора. Ниже приведены две общие формы этого оператора:
using ( obj ) {
// использовать объект obj
}
using ( тип obj = инициализатор) {
// использовать объект obj
}
где obj является выражением, в результате вычисления которого должен быть получен объект, реализующий интерфейс System. IDisposable. Этот объект определяет переменную, которая будет использоваться в блоке оператора using. В первой форме объект объявляется вне оператора using, а во второй форме — в этом операторе. По завершении блока оператора using для объекта obj вызывается метод Dispose (), определенный в интерфейсе System. IDisposable. Таким образом, оператор using предоставляет средства, необходимые для автоматической утилизации объектов, когда они больше не нужны. Не следует, однако, забывать, что оператор using применяется только к объектам, реализующим йнтерфейс System. IDisposable.
В приведенном ниже примере демонстрируются обе формы оператора using.
// Продемонстрировать применение оператора using.
using System; using System.10;
Читать дальше