Г. Шилдт - Полный справочник по C# (1160789), страница 92
Текст из файла (страница 92)
SIZE инициализируется значением 10. После этого его можноиспользовать, но не изменять. Чтобы убедиться в этом, попытайтесь удалить символкомментария, стоящий в начале последней строки, и скомпилировать программу. Выполучите сообщение об ошибке.stackallocС помощью ключевого слова s t a c k a l l o c можно использовать память стека. Этоможно делать только при инициализации локальных переменных.
Распределение памяти стека имеет следующий формат:тип *р = stackalloc тип[размвр]Здесь р — указатель, который получает адрес области памяти достаточно большогоразмера, чтобы хранить размер объектов типа тип. Ключевое слово s t a c k a l l o cможно использовать только в контексте опасного (unsafe) кода.Обычно память для объектов выделяется из кучи, которая представляет собой область свободной памяти.
Выделение памяти из области стека — своего рода исключение. Переменные, размещенные в области стека, не обрабатываются сборщиком мусора. Но они существуют только при выполнении блока, где были объявлены. По завершении выполнения блока эта память освобождается. Единственное достоинствоиспользования ключевого слова s t a c k a l l o c — можно не беспокоиться о том, что соответствующая область памяти попадет под "метлу" сборщика мусора.Рассмотрим пример использования ключевого слова s t a c k a l l o c :// Демонстрация использования ключевого слова s t a c k a l l o c .u s i n g System;class UseStackAlloc {unsafe public s t a t i c void Main() {i n t * p t r s = stackalloc i n t [ 3 ] ;Глава 18. Опасный код, указатели и другие темы497ptrs[O] == 1;ptrs[l] = 2;ptrs[2] = 3;for(int i=0; i < 3;Console.WriteLine(ptrs[ij);Результаты выполнения этой программы таковы:123ИНСТРУКЦИЯ u s i n gКлючевое слово using, применение которого в качестве директивы описано выше,имеет и второй вариант использования, а именно в качестве инструкции using.
Вэтом случае возможны следующие две формы:using (obj) {// Использование объекта obj.using (type obj = инициализатор) {// Использование объекта obj.Здесь элемент obj представляет объект, используемый внутри блока using. В первой форме этот объект объявляется вне us ing-инструкции, а во второй — внутри.При завершении блока для объекта obj вызывается метод Dispose () (определенныйв интерфейсе System. IDisposable). Инструкция u s i n g применяется только к объектам, которые реализованы в интерфейсе System.
IDisposable.Рассмотрим пример использования каждой формы инструкция using:// Демонстрация использования инструкции u s i n g .using System;using System.10;class UsingDemo {public s t a t i c void Main() {StreamReader sr = new StreamReader("test.txt");// Используем объект внутри инструкции using,using(sr) {Console.WriteLine(sr.ReadLine());sr.Close();// Создаем StreamReader-объект внутри инструкции using,using(StreamReader sr2 = new StreamReader("test.txt")) {Console.WriteLine(sr2.ReadLine());sr2.Close();}}498Часть I. Язык С#Класс StreamReader реализует интерфейс IDispo sable (через свой базовый классTextReader). Следовательно, его можно использовать в us ing-инструкции.(Описание интерфейса iDisposable см. в главе 24.)Модификаторы const И v o l a t i l eМодификатор const используется для объявления полей или локальных переменных, которые не должны изменяться.
Этим переменным необходимо присвоить начальные значения при объявлении. Таким образом, const-переменная является посути константой. Например, при выполнении инструкцииI const i n t i = 10;создается const-переменная i, которая имеет значение 10.Модификатор v o l a t i l e сообщает компилятору о том, что значение соответствующего поля может быть изменено в программе неявным образом. Например, поле,содержащее текущее значение системного времени, может обновляться операционнойсистемой автоматически.
В этой ситуации содержимое такого поля изменяется безявного выполнения инструкции присваивания. Причина внешнего изменения поляможет быть очень важной. Дело в том, что С#-компилятору разрешается оптимизировать определенные выражения автоматически в предположении, что содержимое поляостается неизменным, если оно не находится в левой части инструкции присваивания. Но если некоторые факторы, не относящиеся к текущему коду (например, связанные с обработкой второго потока выполнения), изменят значение этого поля, такое предположение окажется неверным. Использование модификатора v o l a t i l e позволяет сообщить компилятору о том, что он должен получать значение этого поляпри каждом обращении к нему.Глава 18. Опасный код, указатели и другие темы499Полныйсправочник поБиблиотека С#Часть II посвящена описанию библиотеки С#.
Какупоминалось в части I, используемая в С# библиотека классовявляется по сути библиотекой .NET Framework. Такимобразом, материал этого раздела применим не только к языкуС#, но и в целом к среде .NET Framework.Библиотека С# организована с использованием пространствимен. Для работы с какой-либо ее частью с помощьюдирективы using импортируется соответствующеепространство имен.
Конечно, можно также указывать полноеимя элемента, т.е. сопровождать его названием пространстваимен, но легче импортировать (так чаще всего и поступают)само пространство имен.Полныйсправочник попримранитви имен dystemЗта глава посвящена пространству имен System, которое занимает наивысшийуровень в библиотеке С#. Оно содержит классы, структуры, интерфейсы и перечисления, которые наиболее часто употребляются в Сопрограммах или считаютсяважной составляющей среды .NET Framework. Таким образом, пространство именSystem определяет ядро библиотеки С#.Пространство имен System также содержит множество вложенных пространствимен, предназначенных для поддержки таких подсистем, как System.Net. Некоторыеиз них описаны ниже в этой книге. Однако в этой главе рассматриваются только члены самого пространства имен System.Члены пространства имен systemПомимо большого количества классов исключений, пространство имен System coдержит следующие классы:ActivatorArrayAttributeUsageAttributeCharEnumeratorContextBoundOb^ ectDBNullEnvironmentFlagsAttributeLocalDataStoreSlotMTAThreadAttributeObjectParamArrayAttributeSerializableAttributeThreadStaticAttributeUnhandledExceptionEventArgsValueTypeAppDomainAssemblyLoadEventArgsBitConverterCLSCompliantAttributeContextStaticAttributeDelegateEventArgsGCMarshalByRefObjectMulticastDelegateObsoleteAttributeRandomSTAThreadAttributeTimeZoneUriVersionAppDomainSetupAttributeBufferConsoleConvertEnumExceptionLoaderOptimizationAttributeMathNonSerializedAttributeOperatingSysternResolveEventArgsStringTypeUriBuilderWeakReferenceВ пространстве имен System определены такие структуры:ArglteratorCharDoubleInt32RuntimeArgumentHandleRuntimeTypeHandleTimeSpanUInt32BooleanDateTimeGuidInt64RuntimeFieldHandleSByteTypedReferenceUInt64ByteDecimalIntl6IntPtrRuntimeMethodHandleSingleUIntl6UlntPtrVoidВ пространстве имен System определены следующие интерфейсы:IAppDomainSetupIComparableIDisposableIServiceProviderIAsyncResultIConvertibleIFormatProviderГлава 19.
Пространство имен SystemICloneableICustomFormatterIFormattable503В пространстве имен System определены такие делегаты:AssemblyLoadEventHandlerAsyncCallbackCrossAppDomainDelegateEventHandlerResolveEventHandlerUnhandledExceptionEventHandlerВ пространстве имен System определены следующие перечисления:AttributeTargetsDayOfWeekEnvironment.SpecialFolderLoaderOptimizationPlatformIDTypeCodeUriHostNameTypeUriPartialКак видно по приведенным выше таблицам, пространство имен System отличаетсядовольно большим объемом, и все его составляющие невозможно детально рассмотреть в одной главе. Более того, хотя некоторые члены System в общем случае применимы к среде .NET Framework, но С#-программистами они обычно не используются.Следует также отметить, что некоторые классы пространства имен System (например,Type, Exception и A t t r i b u t e ) рассмотрены в части I или в других разделах настоящей книги.
А поскольку класс System. S t r i n g , в котором определяется С#-типs t r i n g , представляет собой очень большую и важную тему, его описание приводитсяв главе 20 (как тесно связанное с темой форматирования). Поэтому в настоящей главеописаны только те члены пространства имен System, которые пользуются повышенным вниманием у С#-программистов и не упоминаются в других разделах книги.Класс MathВ классе Math определены такие стандартные математические операции, как извлечение квадратного корня, вычисление синуса, косинуса и логарифмов. Методы,определенные в классе Math, перечислены в табл.
19.1. Все углы задаются в радианах.Обратите внимание на то, что все методы, определенные в классе Math, являютсяstatic-методами. Поэтому для их использования не нужно создавать объект классаMath, а значит, нет необходимости и в конструкторах класса Math.В классе Math также определены следующие два поля:public const double Epublic const double PIгде E — значение основания натурального логарифма, известное как е, a PI — значение иррационального числа pi.Math является sealed-классом, т.е. он не может иметь производных классов.Таблица 19.1. Методы, определенные в классе MathМетодОписаниеp u b l i c s t a t i c doubleВозвращает абсолютную величину параметра vAbs(double v)p u b l i c s t a t i c f l o a t Abs ( f l o a t v)Возвращает абсолютную величину параметра vp u b l i c s t a t i c decimalВозвращает абсолютную величину параметра vA b s ( d e c i m a l v)p u b l i c s t a t i c i n t A b s ( i n t v)Возвращает абсолютную величину параметра vp u b l i c s t a t i c s h o r t Abs ( s h o r t v)Возвращает абсолютную величину параметра vp u b l i c s t a t i c l o n g Abs ( l o n g v)Возвращает абсолютную величину параметра vp u b l i c s t a t i c s b y t e A b s ( s b y t e v)Возвращает абсолютную величину параметра v504Часть II.