Добавить в цитаты Настройки чтения

Страница 341 из 502

<b>const int i = 10;</b>

создается переменная i типа const и устанавливается ее значение 10. Поле типа const очень похоже на поле типа readonly, но все же между ними есть отличие. Если поле типа readonly можно устанавливать в конструкторе, то поле типа const — нельзя.

Ключевое слово, или модификатор, volatile уведомляет компилятор о том, что значение поля может быть изменено двумя или более параллельно выполняющимися потоками. В этой ситуации одному потоку может быть неизвестно, когда поле было изменено другим потоком. И это очень важно, поскольку компилятор C# будет автоматически выполнять определенную оптимизацию, которая будет иметь результат лишь в том случае, если поле доступно только одному потоку. Для того чтобы подобной оптимизации не подвергалось общедоступное поле, оно объявляется как volatile.

Этим компилятор уведомляется о том, что значение поля типа volatile следует получать всякий раз, когда к нему осуществляется доступ.

Помимо рассматривавшейся ранее директивы using, имеется вторая форма ключевого слова using в виде оператора. Ниже приведены две общие формы этого оператора:

<b>using (obj)    {</b>

<b>// использовать объект obj</b>

<b>}</b>

<b>using (тип obj = инициализатор) {</b>

<b>// использовать объект obj</b>

<b>}</b>

где obj является выражением, в результате вычисления которого должен быть получен объект, реализующий интерфейс System.IDisposable. Этот объект определяет переменную, которая будет использоваться в блоке оператора using. В первой форме объект объявляется вне оператора using, а во второй форме — в этом операторе. По завершении блока оператора using для объекта obj вызывается метод Dispose(), определенный в интерфейсе System.IDisposable. Таким образом, оператор using предоставляет средства, необходимые для автоматической утилизации объектов, когда они больше не нужны. Не следует, однако, забывать, что оператор using применяется только к объектам, реализующим интерфейс System.IDisposable.

В приведенном ниже примере демонстрируются обе формы оператора using.

<b>// Продемонстрировать применение оператора using.</b>

<b>using System;</b>

<b>using System.IO;</b>

<b>class UsingDemo {</b>

<b>  static void Main() {</b>

<b>    try {</b>

<b>      StreamReader sr = new StreamReader(&quot;test.txt&quot;);</b>

<b>      // Использовать объект в операторе using,</b>

<b>      using(sr) {</b>

<b>        // ...</b>

<b>      }</b>

<b>    } catch(IOException exc) {</b>

<b>      // ...</b>

<b>    }</b>

<b>    try {</b>

<b>      // Создать объект класса StreamReader в операторе using,</b>

<b>      using(StreamReader sr2 = new StreamReader(&quot;test.txt&quot;))    {</b>

<b>        // ...</b>

<b>      }</b>

<b>    } catch(IOException exc) {</b>

<b>      // ...</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

В данном примере интерфейс IDisposable реализуется в классе StreamReader (посредством его базового класса TextReader). Поэтому он может использоваться в операторе using. По завершении этого оператора автоматически вызывается метод Dispose() для переменной потока, закрывая тем самым поток.

Как следует из приведенного выше примера, оператор using особенно полезен для работы с файлами, поскольку файл автоматически закрывается по завершении блока этого оператора, даже если он и завершается исключением. Таким образом, закрытие файла с помощью оператора using зачастую упрощает код обработки файлов. Разумеется, применение оператора using не ограничивается только работой с файлами. В среде .NET Framework имеется немало других ресурсов, реализующих интерфейс IDisposable. И всеми этими ресурсами можно управлять с помощью оператора using.

Ключевое слово extern находит два основных применения. Каждое из них рассматривается далее по порядку.

В первом своем применении ключевое слово extern было доступно с момента создания С#. Оно обозначает, что метод предоставляется в неуправляемом коде, который не является составной частью программы. Иными словами, метод предоставляется внешним кодом.

Для того чтобы объявить метод как внешний, достаточно указать в самом начале его объявления модификатор extern. Таким образом, общая форма объявления внешнего метода выглядит следующим образом.