Текст книги "Полное руководство. С# 4.0"
Автор книги: Герберт Шилдт
Жанр:
Программирование
сообщить о нарушении
Текущая страница: 44 (всего у книги 58 страниц)
// Продемонстрировать применение поля с ключевым словом readonly. using System;
class MyClass { public static readonly int SIZE = 10; }
class DemoReadOnly { static void Main() { int[] source = new int[MyClass.SIZE]; int[] target = new int[MyClass.SIZE]; // Присвоить ряд значений элементам массива source. for(int i=0; i < MyClass.SIZE; i++) source[i] = i; foreach(int i in source) Console.Write(i + " "); Console.WriteLine(); // Перенести обращенную копию массива source в массив target. for(int i = MyClass.SIZE-1, j = 0; i > 0; i–, j++) target[j] = source[i]; foreach(int i in target) Console.Write(i + " "); Console.WriteLine(); // MyClass.SIZE = 100; // Ошибка!!! He подлежит изменению! }
} В данном примере поле MyClass.SIZE инициализируется значением 10. После этого его можно использовать, но не изменять. Для того чтобы убедиться в этом, уда лите символы комментария в начале последней строки приведенного выше кода и по пробуйте скомпилировать его. В итоге вы получите сообщение об ошибке. ### Ключевые слова const и volatile Ключевое слово, или модификатор, const служит для объявления полей и локаль ных переменных, которые нельзя изменять. Исходные значения таких полей и пере менных должны устанавливаться при их объявлении. Следовательно, переменная с модификатором const, по существу, является константой. Например, в следующей строке кода:
const int i = 10; создается переменная i типа const и устанавливается ее значение 10. Поле типа const очень похоже на поле типа readonly, но все же между ними есть отличие. Если поле типа readonly можно устанавливать в конструкторе, то поле типа const – нельзя. Ключевое слово, или модификатор, volatile уведомляет компилятор о том, что значение поля может быть изменено двумя или более параллельно выполняющимися потоками. В этой ситуации одному потоку может быть неизвестно, когда поле было изменено другим потоком. И это очень важно, поскольку компилятор C# будет автома тически выполнять определенную оптимизацию, которая будет иметь результат лишь в том случае, если поле доступно только одному потоку. Для того чтобы подобной оптимизации не подвергалось общедоступное поле, оно объявляется как volatile. Этим компилятор уведомляется о том, что значение поля типа volatile следует по лучать всякий раз, когда к нему осуществляется доступ. ### Оператор using Помимо рассматривавшейся ранее директивы using, имеется вторая форма ключе вого слова using в виде оператора. Ниже приведены две общие формы этого оператора:
using (obj) { // использовать объект obj }
using (тип obj = инициализатор) { // использовать объект obj } где obj является выражением, в результате вычисления которого должен быть полу чен объект, реализующий интерфейс System.IDisposable. Этот объект определяет переменную, которая будет использоваться в блоке оператора using. В первой форме объект объявляется вне оператора using, а во второй форме – в этом операторе. По завершении блока оператора using для объекта obj вызывается метод 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 было доступно с момента соз дания С#. Оно обозначает, что метод предоставляется в неуправляемом коде, который не является составной частью программы. Иными словами, метод предоставляется внешним кодом. Для того чтобы объявить метод как внешний, достаточно указать в самом начале его объявления модификатор extern. Таким образом, общая форма объявления внешне го метода выглядит следующим образом.
extern возвращаемыйтип имяметода(список_аргументов); Обратите внимание на отсутствие фигурных скобок. В данном варианте ключевое слово extern нередко применяется вместе с атри бутом DllImport, обозначающим библиотеку DLL, в которой содержится внешний метод. Атрибут DllImport принадлежит пространству имен System.Runtime. InteropServices. Он допускает несколько вариантов, но, как правило, достаточно указать лишь имя библиотеки DLL, в которой содержится внешний метод. Вообще го воря, внешние методы следует программировать на С. (Если же это делается на С++, то имя внешнего метода может быть изменено в библиотеке DLL путем дополнительного оформления типов.) Для того чтобы стало понятнее, как пользоваться внешними методами, обратимся к примеру конкретной программы, состоящей из двух файлов. Ниже приведен ис ходный код С из первого файла ExtMeth.с, где определяется метод AbsMax(). include
int __declspec(dllexport) AbsMax(int a, int b) { return abs(a) < abs(b) ? abs(b) : abs(a); } В методе AbsMax() сравниваются абсолютные значения двух его параме тров и возвращается самое большое из них. Обратите внимание на обозначение _ declspec(dllexport). Это специальное расширение языка С для программных средств корпорации Microsoft. Оно уведомляет компилятор о необходимости экспор тировать метод AbsMax() из библиотеки DLL, в которой он содержится. Для компи лирования файла ExtMeth.с в командной строке указывается следующее.
CL /LD /MD ExtMeth.с В итоге создается библиотечный файл DLL – ExtMeth.dll. Далее следует программа на С#, в которой применяется внешний метод AbsMax().
using System; using System.Runtime.InteropServices;
class ExternMeth { // Здесь объявляется внешний метод. [DllImport("ExtMeth.dll")] public extern static int AbsMax(int a, int b); static void Main() { // Использовать внешний метод. int max = AbsMax(-10, —20); Console.WriteLine(max); }
} Обратите внимание на использование атрибута DllImport в приведенной выше программе. Он уведомляет компилятор о наличии библиотеки DLL, содержащей внешний метод AbsMax(). В данном случае это файл ExtMeth.dll, созданный во вре мя компиляции файла с исходным текстом метода AbsMax() на С. В результате вы полнения данной программы на экран, как и ожидалось, выводится значение 20. #### Объявление псевдонима внешней сборки Во втором применении ключевое слово extern предоставляет псевдоним для внешней сборки, что полезно в тех случаях, когда в состав программы включаются две отдельные сборки с одним и тем же именем элемента. Так, если в сборке test1 содер жится класс MyClass, а в сборке test2 класс с таким же именем, то при обращении к классу по этому имени в одной и той же программе может возникнуть конфликт. Для разрешения подобного конфликта необходимо создать псевдоним каждой сборки. Это делается в два этапа. На первом этапе нужно указать псевдонимы, исполь зуя параметр компилятора /r, как в приведенном ниже примере.
/r:Asm1=test1 /r:Asm2=test2 А на втором этапе необходимо ввести операторы с ключевым словом extern, в ко торых делается ссылка на указанные выше псевдонимы. Ниже приведена форма такого оператора для создания псевдонима сборки.
extern alias имя_сборки; Если продолжить приведенный выше пример, то в программе должны появиться следующие строки кода.
extern alias Asm1; extern alias Asm2; Теперь оба варианта класса MyClass будут доступны в программе по соответствую щему псевдониму. Рассмотрим полноценный пример программы, в которой демонстрируется приме нение внешних псевдонимов. Эта программа состоит из трех файлов. Ниже приведен исходный текст, который следует поместить в первый файл – test1.cs.
using System;
namespace MyNS { public class MyClass { public MyClass() { Console.WriteLine("Конструирование из файла MyClass1.dll."); } } } Далее следует исходный текст из файла test2.cs.
using System;
namespace MyNS { public class MyClass { public MyClass() { Console.WriteLine("Конструирование из файла MyClass2.dll."); } } } Обратите внимание на то, что в обоих файлах, test1.cs и test2.cs, объявляется пространство имен MyNS и что именно в этом пространстве в обоих файлах опреде ляется класс MyClass. Следовательно, без псевдонима оба варианта класса MyClass будут недоступными ни одной из программ. И наконец, ниже приведен исходный текст из третьего файла test3.cs, где ис пользуются оба варианта класса MyClass из файлов test1.cs и test2.cs. Это стано вится возможным благодаря операторам с внешними псевдонимами.
// Операторы с внешними псевдонимами должны быть указаны в самом начале файла. extern alias Asm1; extern alias Asm2; using System;
class Demo { static void Main() { Asm1::MyNS.MyClass t = new Asm1::MyNS.MyClass(); Asm2::MyNS.MyClass t2 = new Asm2::MyNS.MyClass(); } } Сначала следует скомпилировать файлы test1.cs и test2.cs в их библиотечные эквиваленты DLL. Для этого достаточно ввести в командной строке следующее.
csc /t:library test1.cs csc /t:library test2.cs Затем необходимо скомпилировать файл test3.cs, указав в командной строке
csc /r:Asm1=test1.dll /r:Asm2=test2.dll test3.cs Обратите внимание на применение параметра /r, уведомляющего компилятор о том, что ссылка на метаданные находится в соответствующем файле. В данном слу чае псевдоним Asm1 связывается с файлом test1.dll, а псевдоним Asm2 – с файлом test2.dll. В самой программе псевдонимы указываются в приведенных ниже операторах с модификатором extern, которые располагаются в самом начале файла.
extern alias Asm1; extern alias Asm2; А в методе Main() псевдонимы используются для разрешения неоднозначности ссылок на класс MyClass. Обратите внимание на следующее применение псевдонима для обращения к классу MyClass.
Asm1::MyNS.MyClass В этой строке кода первым указывается псевдоним, затем оператор разрешения пространства имен, далее имя пространства имен, в котором находится класс с неодно значным именем, и, наконец, имя самого класса, следующее после оператора-точки. Та же самая общая форма пригодна и для других внешних псевдонимов. Ниже приведен результат выполнения данной программы.
Конструирование из файла MyClass1.dll. Конструирование из файла MyClass2.dll. ```
ГЛАВА 21. Пространство имен System
В этой главе речь пойдет о пространстве имен System. Это пространство имен самого верхнего уровня в би блиотеке классов для среды .NET Framework. В нем непосредственно находятся те классы, структуры, интер фейсы, делегаты и перечисления, которые чаще всего при меняются в программах на C# или же считаются неотъем лемой частью среды .NET Framework. Таким образом, про странство имен System составляет ядро рассматриваемой здесь библиотеки классов.
Кроме того, в пространство имен System входит много вложенных пространств имен, поддерживающих отдель ные подсистемы, например System.Net. Некоторые из этих пространств имен рассматриваются далее в этой кни ге. А в этой главе речь пойдет только о членах самого про странства имен System. Члены пространства имен System
Помимо большого количества классов исключений, в пространстве имен содержат ся приведенные ниже классы. ActivationContext Activator AppDomain AppDomainManager AppDomainSetup Applicationld Applicationldentity Array AssemblyLoadEventArgs Attribute AttributeUsageAttribute BitConverter Buffer CharEnumerator CLSCompliantAttribute Console ConsoleCancelEventArgs ContextBoundObject ContextStaticAttribute Convert DBNull Delegate Enum Environment EventArgs Exception FileStyleUriParser FlagsAttribute FtpStyleUriParser GC GenericUriParser GopherStyleUriParser HttpStyleUriParser Lazy
Ниже приведены структуры, определенные в пространстве имен System. Arglterator ArraySegment
В пространстве имен System определены приведенные ниже интерфейсы. _AppDomain lappDomainSetup lAsyncResult lCloneable IComparable IComparable
Ниже приведены делегаты, определенные в пространстве имен System. Action Action<...> (различные формы) AppDomainlnitializer AssemblyLoadEventHandler AsyncCallback Comparison
В пространстве имен System определены приведенные ниже перечисления. ActivationContext.contextForm AppDomainManagerlnitializationOptions AttributeTargets Base64Formatting0ptions ConsoleColor ConsoleKey ConsoleModifiers ConsoleSpecialKey DateTimeKind DayOfWeek Environment.SpecialFolder Environment SpecialFolderOption EnvironmentVariableTarget GCCollectionMode GCNotificationStatus GenericUriParserOptions LoaderOptimization MidpointRounding PlatformID StringComparison StringSplitOptions TypeCode UriComponents UriFormat UriHostNameType UrildnScope UriKind UriPartial
Как следует из приведенных выше таблиц, пространство имен System доволь но обширно, поэтому в одной главе невозможно рассмотреть подробно все его со ставляющие. К тому же, некоторые члены пространства имен System, в том числе Nullable, Type, Exception и Attribute, уже рассматривались в части I или будут представлены в последующих главах части II. И наконец, класс System.String, в ко тором определяется тип string для символьных строк в С#, обсуждается вместе с во просами форматирования в главе 22. В силу этих причин в настоящей главе рассматри ваются только те члены данного пространства имен, которые чаще всего применяются в программировании на C# и не поясняются полностью в остальных главах книги. Класс Math
В классе Math определен ряд стандартных математических операций, в том чис ле извлечение квадратного корня, вычисление синуса, косинуса и логарифмов. Класс Math является статическим, а это означает, что все методы, определенные в нем, отно сятся к типу static, объекты типа Math не конструируются, а сам класс Math неявно герметичен и не может наследоваться. Методы, определенные в классе Math, перечис лены в табл. 21.1, где все углы указаны в радианах.
В классе Math определены также два следующих поля: public const double Е
public const double PI где E – значение основания натурального логарифма числа, которое обычно обозна чается как е; a PI – значение числа пи.
Таблица 21.1. Методы, определенные в классе Math Метод Описание public static double Abs(double value) Возвращает абсолютную величину value public static float Abs(float value) Возвращает абсолютную величину value public static decimal Abs(decimal value) Возвращает абсолютную величину value public static int Abs(int value) Возвращает абсолютную величину value public static short Abs(short value) Возвращает абсолютную величину value public static long Abs(long value) Возвращает абсолютную величину value public static sbyte Abs(sbyte value) Возвращает абсолютную величину value public static double Acos(double d) Возвращает арккосинус d. Значение d должно находиться в пределах от -1 до 1 public static double Asin(double d) Возвращает арксинус d. Значение d должно находиться в пределах от -1 до 1 public static double Atan(double d) Возвращает арктангенс d public static double Atan2(double y, double x) Возвращает арктангенс частного от деления у/ х public static long BigMulfint a, int b) Возвращает произведение а*b в виде значения типа long, исключая переполнение public static double Ceiling(double a) Возвращает наименьшее целое, которое представлено в виде значения с плавающей точкой и не меньше а. Так, если а равно 1,02, метод Ceiling() возвращает значение 2,0. А если а равно -1,02, то метод Ceiling() возвращает значение -1 public static double Ceiling(decimal d) Возвращает наименьшее целое, которое представлено в виде значения десятичного типа и не меньше d. Так, если d равно 1,02, метод Ceiling() возвращает значение 2,0. А если d равно -1,02, то метод Ceiling() возвращает значение -1 public static double Cos (double d) Возвращает косинус d public static double Cosh(double d) Возвращает гиперболический косинус d public static int DivRem(int a, int b, out int result) Возвращает частное от деления а/b, а остаток – в виде параметра result типа out public static long DivRem(long a, long b, out long result) Возвращает частное от деления а/b, а остаток – в виде параметра result типа out public static double Exp (double d) Возвращает основание натурального логарифма е, возведенное в степень d public static decimal Floor(decimal d) Возвращает наибольшее целое, которое представлено в виде значения десятичного типа и не больше d. Так, если d равно 1,02, метод Floor() возвращает значение 1,0. А если d равно -1,02, метод Floor() возвращает значение -2 public static double Floor(double d) Возвращает наибольшее целое, которое представлено в виде значения с плавающей точкой и не больше d. Так, если d равно 1,02, метод Floor() возвращает значение 1,0. А если d равно -1,02, метод Floor() возвращает значение -2 public static double IEEERemainder(double x, double y) Возвращает остаток от деления х/ у public static double Log(double d) Возвращает натуральный логарифм значения d public static double Log(double d, double newBase) Возвращает натуральный логарифм по основанию newBase значения d public static double Log10(double d) Возвращает логарифм по основанию 10 значения d public static double Max(double val1, double val2) Возвращает большее из значений val1 и val2 public static float Max(float val1, float val2) Возвращает большее из значений val1 и val2 public static decimal Max(decimal val1, decimal val2) Возвращает большее из значений val1 и val2 public static int Max(int val1, int val2) Возвращает большее из значений val1 и val2 public static short Max(short val1, short val2) Возвращает большее из значений val1 и val2 public static long Max (long val1, long val2) Возвращает большее из значений val1 и val2 public static uint Max (uint val1, uint val2) Возвращает большее из значений val1 и val2 public static ushort Max(ushort val1, ushort val2) Возвращает большее из значений val1 и val2 public static ulong Max(ulong val1, ulong val2) Возвращает большее из значений val1 и val2 public static byte Max(byte val1, byte val2) Возвращает большее из значений val1 и val2 public static sbyte Max(sbyte val1, sbyte val2) Возвращает большее из значений val1 и val2 public static double Min(double val1, double val2) Возвращает меньшее из значений val1 и val2 public static float Min(float val1, float val2) Возвращает меньшее из значений val1 и val2 public static decimal Min(decimal val1, decimal val2) Возвращает меньшее из значений val1 и val2 public static int Min(int val1, int val2) Возвращает меньшее из значений val1 и val2 public static short Min(short val1, short val2) Возвращает меньшее из значений val1 и val2 public static long Min(long val1, long val2) Возвращает меньшее из значений val1 и val2 public static uint Min(uint val1, uint val2) Возвращает меньшее из значений val1 и val2 public static ushort Min(ushort val1, ushort val2) Возвращает меньшее из значений val1 и val2 public static ulong Min(ulong val1, ulong val2) Возвращает меньшее из значений val1 и val2 public static byte Min(byte val1, byte val2) Возвращает меньшее из значений val1 и val2 public static sbyte Min(sbyte val1, sbyte val2) Возвращает меньшее из значений val1 и val2 public static double Pow(double x, double y) Возвращает значение х, возведенное в степень у(xy) public static double Round(double a) Возвращает значение а, округленное до ближайшего целого числа public static decimal Round(decimal d) Возвращает значение d, округленное до ближайшего целого числа public static double Round(double value, int digits) Возвращает значение value, округленное до числа, количество цифр в дробной части которого равно значению параметра digits public static decimal Round(decimal d, int digits) Возвращает значение d, округленное до числа, количество цифр в дробной части которого равно значению digits public static double Round(double value, MidpointRounding mode) Возвращает значение value, округленное до ближайшего целого числа в режиме, определяемом параметром mode public static decimal Round(decimal d, MidpointRounding mode) Возвращает значение d, округленное до ближайшего целого числа в режиме, определяемом параметром mode public static double Round(double value, int digits, MidpointRounding mode) Возвращает значение value, округленное до числа, количество цифр в дробной части которого равно значению digits, а параметр mode определяет режим округления public static decimal Round(decimal d, int digits, MidpointRounding mode) Возвращает значение d, округленное до числа, количество цифр в дробной части которого равно значению digits, а параметр mode определяет режим округления public static int Sign(double value) Возвращает -1, если значение value меньше нуля; 0, если значение value равно нулю; и 1, если значение value больше нуля public static int Sign(float value) Возвращает -1, если значение value меньше нуля; 0, если значение value равно нулю; и 1, если значение value больше нуля public static int Sign(decimal value) Возвращает -1, если значение value меньше нуля; 0, если значение value равно нулю; и 1, если значение value больше нуля public static int Sign(int value) Возвращает -1, если значение value меньше нуля; 0, если значение value равно нулю; и 1, если значение value больше нуля public static int Sign(short value) Возвращает -1, если значение value меньше нуля; 0, если значение value равно нулю; и 1, если значение value больше нуля public static int Sign (long value) Возвращает -1, если значение value меньше нуля; 0, если значение value равно нулю; и 1, если значение value больше нуля public static int Sign(sbyte value) Возвращает -1, если значение value меньше нуля; 0, если значение value равно нулю; и 1, если значение value больше нуля public static double Sin(double a) Возвращает синус числа а public static double Sinh(double value) Возвращает гиперболический синус числа value public static double Sqrt(double d) Возвращает квадратный корень числа d public static double Tan(double a) Возвращает тангенс числа а public static double Tanh(double value) Возвращает гиперболический тангенс числа value public static double Truncate(double d) Возвращает целую часть числа d public static decimal Truncate(decimal d) Возвращает целую часть числа d
В приведенном ниже примере программы метод Sqrt() служит для расчета ги потенузы по длине противоположных сторон прямоугольного треугольника согласно теореме Пифагора. // Расчет гипотенузы по теореме Пифагора. using System; class Pythagorean { static void Main() { double s1; double s2; double hypot; string str; Console.WriteLine("Введите длину первой стороны треугольника: "); str = Console.ReadLine(); s1 = Double.Parse(str); Console.WriteLine("Введите длину второй стороны треугольника: "); str = Console.ReadLine(); s2 = Double.Parse(str); hypot = Math.Sqrt(s1*s1 + s2*s2); Console.WriteLine("Длина гипотенузы равна " + hypot); } }
Ниже приведен один из возможных результатов выполнения этой программы. Введите длину первой стороны треугольника: 3 Введите длину второй стороны треугольника: 4 Длина гипотенузы равна: 5
Далее следует пример программы, в которой метод Pow() служит для расчета пер воначальных капиталовложений, требующихся для получения предполагаемой буду щей стоимости, исходя из годовой нормы прибыли и количества лет. Ниже приведена формула для расчета первоначальных капиталовложений. первоначальные капиталовложения = будущая стоимость / (1 + норма прибыли)количество лет
В вызове метода Pow() необходимо указывать аргументы типа double, поэтому норма прибыли и количество лет задаются в виде значений типа double. А перво начальные капиталовложения и будущая стоимость задаются в виде значений типа decimal. /* Рассчитать первоначальные капиталовложения, необходимые для получения заданной будущей стоимости, исходя из годовой нормы прибыли и количества лет. */ using System; class InitialInvestment { static void Main() { decimal initInvest; // первоначальные капиталовложения decimal futVal; // будущая стоимость double numYears; // количество лет double intRate; // годовая норма прибыли string str; Console.Write("Введите будущую стоимость: "); str = Console.ReadLine(); try { futVal = Decimal.Parse(str); } catch(FormatException exc) { Console.WriteLine(exc.Message); return; } Console.Write("Введите норму прибыли (например, 0.085): "); str = Console.ReadLine(); try { intRate = Double.Parse(str); } catch(FormatException exc) { Console.WriteLine(exc.Message); return; } Console.Write("Введите количество лет: "); str = Console.ReadLine(); try { numYears = Double.Parse(str); } catch(FormatException exc) { Console.WriteLine(exc.Message); return; } initInvest = futVal / (decimal) Math.Pow(intRate+1.0, numYears); Console.WriteLine("Необходимые первоначальные капиталовложения: {0:C}", initInvest); } }
Ниже приведен один из возможных результатов выполнения этой программы. Введите будущую стоимость: 10000 Введите норму прибыли (например, 0.085): 0.07 Введите количество лет: 10 Необходимые первоначальные капиталовложения: $5,083.49 Структуры .NET, соответствующие встроенным типам значений
Структуры, соответствующие встроенным в C# типам значений, были представлены в главе 14, где они упоминались в связи с преобразованием строк, содержащих число вые значения в удобочитаемой форме, в эквивалентные двоичные значения. В этом разделе структуры .NET рассматриваются более подобно.
Имена структур .NET и соответствующие им ключевые слова, обозначающие типы значений в С#, перечислены в приведенной ниже таблице. Имя структуры в .NET Имя типа значения в C# System.Boolean bool System.Char char System.Decimal decimal System.Double double System.Single float System.Int16 short System.Int32 int System.Int64 long System.UInt16 ushort System.UInt32 uint System.UInt64 ulong System.Byte byte System.Sbyte sbyte
Используя члены, определенные в этих структурах, можно выполнять операции над значениями простых типов данных. Все перечисленные выше структуры рассма триваются далее по порядку.
ПРИМЕЧАНИЕ Некоторые методы, определенные в структурах, соответствующих встроенным в C# ти пам значений, принимают параметры типа IFormatProvider или NumberStyles. Тип IFormatProvider вкратце описывается далее в этой главе, а тип NumberStyles пред ставляет собой перечисление из пространства имен System.Globalization. Вопросы форматирования подробнее рассматриваются в главе 22. Структуры целочисленных типов данных
Ниже перечислены структуры целочисленных типов данных. Byte SByte Int16 Uint16 Int32 UInt32 Int64 UInt64
Каждая из этих структур содержит одинаковое количество членов. В табл. 21.2 для примера перечислены члены структуры Int32. Аналогичные члены в виде методов имеются и у других структур, за исключением целочисленного типа, который они представляют.
Помимо перечисленных выше методов, в структурах целочисленных типов данных определены следующие поля типа const. MaxValue MinValue
В каждой структуре эти поля содержат наибольшее и наименьшее значения, до пустимые для данных соответствующего целочисленного типа.
Во всех структурах целочисленных типов данных реализуются следующие ин терфейсы: IComparable, IComparable
Таблица 21.2. Методы, поддерживаемые структурой Int32 Метод Назначение public int CompareTo(object value) Сравнивает числовое значение вызывающего объекта со значением value. Возвращает нуль, если сравниваемые значения равны; отрицательное значение, если вызывающий объект имеет меньшее значение; и, наконец, положительное значение, если вызывающий объект имеет большее значение public int CompareTo(int value) Сравнивает числовое значение вызывающего объекта со значением value. Возвращает нуль, если сравниваемые значения равны; отрицательное значение, если вызывающий объект имеет меньшее значение; и, наконец, положительное значение, если вызывающий объект имеет большее значение public override bool Equals(object obj) Возвращает логическое значение true, если значение вызывающего объекта равно значению параметра obj public bool Equals(int obj) Возвращает логическое значение true, если значение вызывающего объекта равно значению параметра obj public override int GetHashCode() Возвращает хеш-код для вызывающего объекта public TypeCode GetTypeCode() Возвращает значение перечисления TypeCode для эквивалентного типа. Например, для структуры Int32 возвращается значение TypeCode.Int32 public static int Parse(string s) Возвращает двоичный эквивалент числа, заданного в виде символьной строки s. Если числовое значение не представлено в строке так, как определено в структуре данного типа, то генерируется исключение public static int Parse(string s, IformatProvider provider) Возвращает двоичный эквивалент числа, заданного в виде символьной строки s, с использованием форматов данных, характерных для конкретной культурной среды и определяемых параметром provider. Если числовое значение не представлено в строке так, как определено в структуре данного типа, то генерируется исключение public static int Parse(string s, NumberStyles styles) Возвращает двоичный эквивалент числа, заданного в виде символьной строки s, с использованием данных о стилях, определяемых параметром styles. Если числовое значение не представлено в строке так, как определено в структуре данного типа, то генерируется исключение public static int Parse (string s, NumberStyles styles, IformatProvider provider) Возвращает двоичный эквивалент числа, заданного в виде строки символьной s, с использованием данных о стилях, определяемых параметром styles, а также форматов данных, характерных для конкретной культурной среды и определяемых параметром provider. Если числовое значение не представлено в строке так, как определено в структуре данного типа, то генерируется исключение public override string ToString() Возвращает строковое представление значения вызывающего объекта public string ToString(string format) Возвращает строковое представление значения вызывающего объекта, как указано в форматирующей строке, определяемой параметром format public string ToString(IformatProvider provider) Возвращает строковое представление значения вызывающего объекта с использованием форматов данных, характерных для конкретной культурной среды и определяемых параметром provider public string ToString(string format, IformatProvider provider) Возвращает строковое представление значения вызывающего объекта, как указано в форматирующей строке, определяемой параметром format, но с использованием форматов данных, характерных для конкретной культурной среды и определяемых параметром provider public static bool TryParse(string s, out int result) Предпринимает попытку преобразовать числовое значение, заданное в виде символьной строки s, в двоичное значение. При успешной попытке это значение сохраняется в параметре result и возвращается логическое значение true, а иначе возвращается логическое значение false, в отличие от метода Parse(), который генерирует исключение при неудачном исходе преобразования public static bool TryParse(string s, NumberStyles styles, IformatProvider provider, out int result) Предпринимает попытку преобразовать числовое значение, заданное в виде символьной строки s, в двоичное значение с использованием информации о стилях, обозначаемых параметром styles, а также форматов данных, характерных для конкретной культурной среды и определяемых параметром provider. При успешной попытке это значение сохраняется в параметре result и возвращается логическое значение true, а иначе возвращается логическое значение false, в отличие от метода Parse(), который генерирует исключение при неудачном исходе преобразования Структуры типов данных с плавающей точкой