Ключевое слово, или модификатор, const
служит для объявления полей и локальных переменных, которые нельзя изменять. Исходные значения таких полей и переменных должны устанавливаться при их объявлении. Следовательно, переменная с модификатором const
, по существу, является константой. Например, в следующей строке кода:
const int i = 10;
создается переменная i типа const
и устанавливается ее значение 10. Поле типа const
очень похоже на поле типа readonly
, но все же между ними есть отличие. Если поле типа readonly
можно устанавливать в конструкторе, то поле типа const
— нельзя.
Ключевое слово, или модификатор, volatile
уведомляет компилятор о том, что значение поля может быть изменено двумя или более параллельно выполняющимися потоками. В этой ситуации одному потоку может быть неизвестно, когда поле было изменено другим потоком. И это очень важно, поскольку компилятор C# будет автоматически выполнять определенную оптимизацию, которая будет иметь результат лишь в том случае, если поле доступно только одному потоку. Для того чтобы подобной оптимизации не подвергалось общедоступное поле, оно объявляется как volatile
.
Этим компилятор уведомляется о том, что значение поля типа volatile
следует получать всякий раз, когда к нему осуществляется доступ.
Помимо рассматривавшейся ранее using
, имеется вторая форма ключевого слова using
в виде
using (obj) {
// использовать объект obj
}
using (тип obj = инициализатор) {
// использовать объект obj
}
где System.IDisposable
. Этот объект определяет переменную, которая будет использоваться в блоке оператора using
. В первой форме объект объявляется вне оператора using
, а во второй форме — в этом операторе. По завершении блока оператора using
для объекта Dispose()
, определенный в интерфейсе System.IDisposable
. Таким образом, оператор using
предоставляет средства, необходимые для автоматической утилизации объектов, когда они больше не нужны. Не следует, однако, забывать, что оператор using
применяется только к объектам, реализующим интерфейс System.IDisposable
.
В приведенном ниже примере демонстрируются обе формы оператора using
.
// Продемонстрировать применение оператора using.
using System;
using System.IO;
class UsingDemo {
static void Main() {
try {
StreamReader sr = new StreamReader("test.txt");
// Использовать объект в операторе using,
using(sr) {
// ...
}
} catch(IOException exc) {
// ...
}
try {
// Создать объект класса StreamReader в операторе using,
using(StreamReader sr2 = new StreamReader("test.txt")) {
// ...
}
} catch(IOException exc) {
// ...
}
}
}
В данном примере интерфейс IDisposable
реализуется в классе StreamReader
(посредством его базового класса TextReader
). Поэтому он может использоваться в операторе using
. По завершении этого оператора автоматически вызывается метод Dispose()
для переменной потока, закрывая тем самым поток.
Как следует из приведенного выше примера, оператор using
особенно полезен для работы с файлами, поскольку файл автоматически закрывается по завершении блока этого оператора, даже если он и завершается исключением. Таким образом, закрытие файла с помощью оператора using
зачастую упрощает код обработки файлов. Разумеется, применение оператора using
не ограничивается только работой с файлами. В среде .NET Framework имеется немало других ресурсов, реализующих интерфейс IDisposable
. И всеми этими ресурсами можно управлять с помощью оператора using
.
Ключевое слово extern
находит два основных применения. Каждое из них рассматривается далее по порядку.
В первом своем применении ключевое слово extern
было доступно с момента создания С#. Оно обозначает, что метод предоставляется в неуправляемом коде, который не является составной частью программы. Иными словами, метод предоставляется внешним кодом.
Для того чтобы объявить метод как внешний, достаточно указать в самом начале его объявления модификатор extern
. Таким образом, общая форма объявления внешнего метода выглядит следующим образом.