Г. Шилдт - С#4.0 Полное руководство (1160795), страница 139
Текст из файла (страница 139)
Поле типа сопвС очень похоже на поле типа сеас(оп1у, но все же между ними есть отличие. Если поле типа сеабоп1у можно устанавливать в конструкторе, то поле типа сопзс — нельзя. Ключевое слово, или модификатор, чо1аС11е уведомляет компилятор о том, что значение поля может быть изменено двумя или более параллельно выполняющимися потоками. В этой ситуации одному потоку может быть неизвестно, когда поле было изменено другим потоком. И это очень важно, поскольку компилятор С(( будет автоматически выполнять определенную оптимизацию, которая будет иметь результат лишь в том случае, если поле доступно только одному потоку.
Для того чтобы подобной оптимизации не подвергалось общедоступное поле, оно объявляется как чо1аС11е. Глава 20. Небезопасный код, указатели, обнуляеыые типы и разные ключевые слова 7зд. Этим компилятор уведомляется о том, что значение поля типа уо1ас11е следует по- лучать всякий раз, когда к нему осуществляется доступ, Оператор тзвз.тз(т Помимо рассматривавшейся ранее дирекглиеы иядпд, имеется вторая форма ключевого слова пя 1пд в виде опералюра.
Ниже приведены две общие формы этого оператора: оягпд (оЬд) ( // использовать объект оЬд ) оягпд (тип оЬ2 = ииипиалияатор) ( О использовать объект обт ) где оЬз является выражением, в результате вычисления которого должен быть получен обьект, реализующий интерфейс Бузят. 1П1зрояаЬ1е. Этот объект определяет переменную, которая будет использоваться в блоке оператора падпд. В первой форме объект объявляется вне оператора пя1пд, а во второй форме — в этом операторе. По завершении блока оператора пз1пд для объекта оЬт' вызывается метод П1ярозе (), определенный в интерфейсе Бузтев.
1Р1ярозаЬ1е. Таким образом, оператор пзьпд предоставляет средства, необходимые для автоматической утилизации объектов, когда они больше не нужны. Не следует, однако, забывать, что оператор иядпд применяется только к объектам, реализующим интерфейс Бузбеи. 1П1зрояаЬ1е. В приведенном ниже примере демонстрируются обе формы оператора и я 1пд. // Продемонстрировать применение оператора оятпд. оятпд Буягево ояьпд Буягеи. 10; с1аяя ПяьпдПезо ( ясасгс чоьб Наьп() ггу ( Бггеазиеас1ег яг = пее Бггеапнеабег("геяг.гхг") // Использовать объект в операторе пя1пд.
оя1пд(яг) ( О ) ] сассп(10Ехсерс1оп ехс) ( // ) ггу ( Создать объект класса Бсгеапйеаоег в операторе оялпд. пагод(зггеалЯеабег яг2 = пеи Бггеазиеабег("геяг.гхг")) // ) ) пасси(10Ехсерг1оп ехс) ( // ) ) ) 712 Часть ). язык С№ В данном примере интерфейс 1Р1ярояаЬ|е реализуется в классе Ьсгеаввеаг(ег (посредством его базового класса техсвеас)ег). Поэтому он может использоваться в операторе ия1по. По завершении этого оператора автоматически вызывается метод Рьярояе () для переменной потока, закрывая тем самым поток. Как следует из приведенного выше примера, оператор ия тпо особенно полезен для работы с файлами, поскольку файл автоматически закрывается по завершении блока этого оператора, даже если он и завершается исключением.
Таким образом, закрытие файла с помощью оператора па1пд зачастую упрощает код обработки файлов. Разумеется, применение оператора пя1пд не ограничивается только работой с файлами. В среде .)ЫЕТ Егашегчог)< имеется немало других ресурсов, реализующих интерфейс 1Р1ярояаЬ1е. И всеми этими ресурсами можно управлять с помощью оператора п51пя. Ключевое слово ех~еш Ключевое слово ехсегп находит два основных применения. Каждое из них рассматривается далее по порядку. Объявление внешних методов В первом своем применении ключевое слово ех се гп было доступно с момента создания СК Оно обозначает, что метод предоставляется в неуправляемом коде, который не является составной частью программы. Иными словами, метод предоставляется внешним кодом.
Для того чтобы объявить метод как внешний, достаточно указать в самом начале его объявления модификатор ехсегп. Таким образом, общая форма объявления внешнего метода выглядит следующим образом. ехгегп яояярамаемьх< тип имя метода(список аргументов) 1 Обратите внимание на отсутствие фигурных скобок. В данном варианте ключевое слово ехсегп нередко применяется вместе с атрибутом Р111вро гс, обозначающим библиотеку О11, в которой содержится внешний метод.
Атрибут Р111врогс принадлежит пространству имен Буясев. йппс1те. 1пьегорвегчьсея. Он допускает несколько вариантов, но, как правило, достаточно указать лишь имя библиотеки 011, в которой содержится внешний метод. Вообще говоря, внешние методы следует программировать на С. (Если же это делается на Сь+, то имя внешнего метода может быть изменено в библиотеке ОЬЬ путем дополнительного оформления типов.) Для того чтобы стало понятнее, как пользоваться внешними методами, обратимся к примеру конкретной программы, состоящей из двух файлов. Ниже приведен исходный код С из первого файла Ехьиеьп.
с, где определяется метод АЬяМах () . №ьпо1ияе <яся11Ь.Ь> 1пг г(ес1ярес(о11ехрогс) ЛЬяиах(1пг а, ьпс Ь) ( геяогп аЬ*(а) < аЬя(Ь) ? аЬя(Ь) : аЬя(а); ) В методе АЬяМах () сравниваются абсолютные значения двух его параметров и возвращается самое большое из них. Обратите внимание на обозначение с)ес1ярес (с(11ехрогс) . Это специальное расширение языка С для программных Глава 20. Небезопасный код, указатели, обнуляеыые типы и разные ключевые слова 713 средств корпорации М(сгояо((.
Оно уведомляет компилятор о необходимости экспортировать метод АЬянах () из библиотеки 1Х(., в которой он содержится. Для компилирования файла ехсмесь. с в командной строке указывается следующее. сь /ы) /ис вхы(вть.с В итоге создается библиотечный файл Р1Л. — ех смесь . б11. Далее следует программа на СЗ, в которой применяется внешний метод АЬяМах () . патлы яуясеш~ пяьпп Яуяяеш.пппг1ше.1ппетсрзетттсея1 с1ая* ЕхбегпМесЬ ( // Здесь объявляется внешний метод.
(0111шрсгг("ЕхСМебп.б11")) рсЫ1с ехбегп яяап1с 1пс АЬяМах(тпя а, тпп Ь) ясасьс тсг Е Ма1п () ( // Использовать внешний метод. ьпя шах = ЛЬямах(-10, -20); Сспяс1е.итзпеъзпе(пшх); ) ) Обратите внимание на использование атрибута 0111шрогс в приведенной выше программе. Он уведомляет компилятор о наличии библиотеки РЕ), содержащей внешний метод АЬямах () . В данном случае это файл ЕхСМеСЬ. б11, созданный во время компиляции файла с исходным текстом метода АЬямах () на С.
В результате выполнения данной программы на экран, как и ожидалось, выводится значение 20. Объявление псевдонима внешней сборки Во втором применении ключевое слово ехсегп предоставляет псевдоним для внешней сборки, что полезно в тех случаях, когда в состав программы включаются две отдельные сборки с одним и тем же именем элемента. Так, если в сборке сеяс1 содержится класс МуС1ая я, а в сборке Се я 02 класс с таким же именем, то при обращении к классу по этому имени в одной и той же программе может возникнуть конфликт.
Для разрешения подобного конфликта необходимо создать псевдоним каждой сборки. Это делается в два этапа. На первом этапе нужно указать псевдонимы, используя параметр компилятора / г, как в приведенном ниже примере. /т:Аяш1чбея51 /г:Аяш2гдеяс2 А на втором этапе необходимо ввести операторы с ключевым словом ехсегп, в которых делается ссылка на указанные выше псевдонимы. Ниже приведена форма такого оператора для создания псевдонима сборки.
ехдегп 511ая имя сборки; Если продолжить приведенный выше пример, то в программе должны появиться следующие строки кода. ехяегп 51555 Аяш1; ехтегп а1155 Аяш2; 714 Часть (. Язык С(( Теперь оба варианта класса Мус1а я я будут доступны в программе по соответствующему псевдониму. Рассмотрим полноценный пример программы, в которой демонстрируется применение внешних псевдонимов. Эта программа состоит из трех файлов. Ниже приведен исходный текст, который следует поместить в первый файл — Се яб1 . ся. оягп9 Яуяпешг пашеврасе МуНЯ ( роЫпс с1аяв МуС1авв ( роЬ11с МуС1авя() ( Сопяо1е.игьгеьипе("Конструирование из файла Мус1аяв1.С11.")г ) Далее следует исходный текст из файла сеяс2.