1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 91
Текст из файла (страница 91)
Опасный код, указатели и другие темы497ptrs[0] = 1;ptrs[1] = 2;ptrs[2] = 3;}}for(int i=0; i < 3; i++)Console.WriteLine(ptrs[i]);Результаты выполнения этой программы таковы:123Инструкция usingКлючевое слово using, применение которого в качестве директивы описано выше,имеет и второй вариант использования, а именно в качестве инструкции using. В этомслучае возможны следующие две формы:using(obj) {// Использование объекта obj.}using(type obj = инициализатор) {// Использование объекта obj.}Здесь элемент obj представляет объект, используемый внутри блока using.
Впервой форме этот объект объявляется вне using-инструкиии, а во второй — внутри, Призавершении блока для объекта obj вызывается метод Dispose() (определенный винтерфейсе System.IDisposable). Инструкция using применяется только к объектам,которые реализованы в интерфейсе System.IDisposable.Рассмотрим пример использования каждой формы инструкция using:// Демонстрация использования инструкции using.using System;using System.IO;class UsingDemo {public static void Main() {StreamReader sr = new StreamReader("test.txt");// Используем объект внутри инструкции using.using(sr) {Console.WriteLine(sr.ReadLine() );sr.Close();}}}498// Создаем StreamReader-объект внутри инструкции using.using(StreamReader sr2 = new StreamReader("test.txt")) {Console.WriteLine(sr2.ReadLine());sr2.Close();}Часть I.
Язык C#Класс StreamReader реализует интерфейс IDisposable (через свой базовыйкласс TextReader). Следовательно, его можно использовать в using-инструкции.(Описание интерфейса IDisposable см. в главе 24.)Модификаторы const и volatileМодификатор const используется для объявления полей или локальных переменных,которые не должны изменяться. Этим переменным необходимо присвоить начальныезначения при объявлении. Таким образом, const-переменная является по сути константой.Например, при выполнении инструкцииconst int i = 10;создается const-переменная i, которая имеет значение 10.Модификатор volatile сообщает компилятору о том, что значениесоответствующего поля может быть изменено в программе неявным образом.
Например,поле, содержащее текущее значение системного времени, может обновляться операционнойсистемой автоматически. В этой ситуации содержимое такого поля изменяется без явноговыполнения инструкции присваивания. Причина внешнего изменения поля может бытьочень важной. Дело в том, что C#-компилятору разрешается оптимизировать определенныевыражения автоматически в предположении, что содержимое поля остается неизменным,если оно не находится в левой части инструкции присваивания. Но если некоторыефакторы, не относящиеся к текущему коду (например, связанные с обработкой второгопотока выполнения), изменят значение этого поля, такое предположение окажетсяневерным.
Использование модификатора volatile позволяет сообщить компилятору отом, что он должен получать значение этого поля при каждом обращении к нему.Глава 18. Опасный код, указатели и другие темы499Полныйсправочник поЧасть IIБиблиотека C#Часть II посвящена описанию библиотеки C#. Какупоминалось в части I, используемая в C# библиотекаклассов является, по сути, библиотекой .NETFramework. Таким образом, материал этого разделаприменим не только к языку C#, но и в целом к среде.NET Framework. Библиотека C# организована сиспользованием пространств имен.
Для работы с какойлибо ее частью с помощью директивы usingимпортируется соответствующее пространство имен.Конечно, можно также указывать полное имя элемента,т.е. сопровождать его названием пространства имен, нолегче импортировать (так чаще всего и поступают)само пространство имен.Полныйсправочник поГлава 19Пространство имен SystemЭта глава посвящена пространству имен System, которое занимает наивысшийуровень в библиотеке C#. Оно содержит классы, структуры, интерфейсы иперечисления, которые наиболее часто употребляются в C#-программах или считаютсяважной составляющей среды .NET Framework. Таким образом, пространство имен Systemопределяет ядро библиотеки C#.Пространство имен System также содержит множество вложенных пространствимен, предназначенных для поддержки таких подсистем, как System.Net.
Некоторые изних описаны ниже в этой книге. Однако в этой главе рассматриваются только члены самогопространства имен System.Члены пространства имен SystemПомимо большого количества классов исключений, пространство имен System содержит следующие классы:ActivatorArrayAttributeUsageAttributeCharEnumeratorContextBoundObjectDBNullEnvironmentFlagsAttributeLocalDataStoreSlotMTAThreadAttributeObjectParamArrayAttributeSerializableAttributeThreadStaticAttributeUnhandledExceptionEventArgsValueTypeAppDomainAssemblyLoadEventArgsBitConverterCLSCompliantAttributeContextStaticAttributeDelegateEventArgsGCMarshalByRefObjectMulticastDelegateObsoleteAttributeRandomSTAThreadAttributeTimeZoneUriVersionAppDomainSetupAttributeBufferConsoleConvertEnumExceptionLoaderOptimizationAttributeMathNonSerializedAttributeOperatingSystemResolveEventArgsStringTypeOriBuilderWeakReferenceВ пространстве имен System определены такие структурыArgIteratorCharDoubleInt32RuntimeArgumentHandleRuntimeTypeHandleTimeSpanUInt32VoidBooleanDateTimeGuidInt64RuntimeFieldHandleSByteTypedReferenceUInt64ByteDecimalInt16IntPtrRuntimeMethodHandleSingleUInt16UintPtrВ пространстве имен System определены следующие интерфейсы:IAppDomainSetupIComparableIDisposableIServiceProviderIAsyncResultIConvertibleIFormatProviderГлава 19.
Пространство имен SystemICloneableICustomFormatterIFormattable503В пространстве имен System определены такие делегаты:AssemblyLoadEventHandlerEventHandlerAsyncCallbackResolveEventHandlerCrossAppDomainDelegateUnhandledExceptionEventHandlerВ пространстве имен System определены следующие перечисления:AttributeTargetsLoaderOptimizationUriHostNameTypeDayOfWeekPlatformIDUriPartialEnvironment.SpecialFolderTypeCodeКак видно по приведенным выше таблицам, пространство имен System отличаетсядовольно большим объемом, и все его составляющие невозможно детально рассмотреть водной главе.
Более того, хотя некоторые члены System в общем случае применимы к среде.NET Framework, но C#-программистами они обычно не используются. Следует такжеотметить, что некоторые классы пространства имен System (например, Type, Exceptionи Attribute) рассмотрены в части I или в других разделах настоящей книги.
А посколькукласс System. String, в котором определяется C#-тип string, представляет собой оченьбольшую и важную тему, его описание приводится в главе 20 (как тесно связанное с темойформатирования). Поэтому в настоящей главе описаны только те члены пространства именSystem, которые пользуются повышенным вниманием у C#-программистов и неупоминаются в других разделах книги.Класс MathВ классе Math определены такие стандартные математические операции, какизвлечение квадратного корня, вычисление синуса, косинуса и логарифмов.
Методы,определенные в классе Math, перечислены в табл. 19.1. Все углы задаются в радианах.Обратите внимание на то, что все методы, определенные в классе Math, являются staticметодами. Поэтому для их использования не нужно создавать объект класса Math, а значит,нет необходимости и в конструкторах класса Math.В классе Math также определены следующие два поля:public const double Epublic const double PIгде E — значение основания натурального логарифма, известное как е, a PI —значение иррационального числа π.Math является sealed-классом, т.е. он не может иметь производных классов.Таблица 19.1. Методы, определенные в классе MathМетодОписаниеpublic static double Abs(double v)public static float Abs (float v)public static decimal Abs(decimal v)public static int Abs(int v)public static short Abs(short v)public static long Abs(long v)public static sbyte Abs(sbyte v)Возвращает абсолютную величину параметра v504Возвращает абсолютную величину параметра vВозвращает абсолютную величину параметра vВозвращает абсолютную величину параметра vВозвращает абсолютную величину параметра vВозвращает абсолютную величину параметра vВозвращает абсолютную величину параметра vЧасть II.
Библиотека C#Продолжение табл. 19.1.МетодОписаниеpublic staticdouble v)public staticdouble v)public staticdouble v)public staticdouble y,double x)public staticdouble v)double Acos(public staticdouble v)public staticdouble v)public staticdouble v)public staticdouble v)double Atan(Возвращает арккосинус параметра v.
Значение vдолжно находиться в диапазоне между -1 и 1Возвращает арксинус параметра v. Значение vдолжно находиться в диапазоне между -1 и 1Возвращает арктангенс параметра vdouble Atan2(Возвращает арктангенс частного y/xdouble Ceiling(double Cos(Возвращает наименьшее целое (представленное ввиде значения с плавающей точкой), которое неменьше параметра v. Например, при v, равном1.02, метод Ceiling() возвратит 2.0. А при v,равном -1.02, метод Ceiling() возвратит -1Возвращает косинус параметра vdouble Cosh(Возвращает гиперболический косинус параметра vdouble Exp(Возвращает основание натурального логарифма е,возведенное в степень vВозвращает наибольшее целое (представленное ввиде значения с плавающей точкой), которое небольше параметра v. Например, при v, равном1.02, метод Floor() возвратит 1.0.
А при v,равном -1.02, метод Floor() возвратит -2Возвращает остаток от деленияdividend/divisordouble Asin(double Floor(public static double IEEERemainder(double dividend,double divisor)public static double Log(double v)public static double Log(double v,double base)public static double Log10(double v)public static double Max(double v1,double v2)public static float Max(float v1,float v2)public static decimal Max(decimal v1,decimal v2)public static int Max(int v1,int v2)public static short Max(short v1,short v2)public static long Max(long v1,long v2)Глава 19.