Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

5.3. Специфические методы и поля простых типов

Кроме методов, унаследованных от общего базового класса Object, каждый

простой тип имеет набор собственных методов и свойств. Рассмотрим те из них,

которые являются достаточно общими и чаще всего применяются в программах.

Метод, без которого трудно обойтись в реальных программах, это метод

Parse()

"метод:метод Parse()" , назначение которого – преобразовать текстовую

строку в числовое или логическое значение. Полезность этого метода связана с тем

фактом, что при общении с программой пользователь обычно вводит числовые

значения (например, с клавиатуры), в виде последовательности символов, а в

программе

они

должны

быть

представлены

в

виде

машинных

кодов

соответствующих чисел.

Задача перекодирования символьной строки в код числового значения, во-

первых ,

трудоемка

для

программирования ,

а

во - вторых ,

не

каждая

последовательность символов может быть преобразована в числовое значение

.

Метод Parse(), определенный в каждом классе арифметических типов (Int32,

Double…),

позволяет

автоматизировать

решение

задачи

распознавания

"правильных" записей числовых значений и задачи их преобразования в числа.

Метод Parse() убирает из строки лишние пробелы слева и справа и незначащие

левые нули.

Следующая программа иллюстрирует применение метода к строковым

литералам, представляющим числовые значения:

// 05_02.cs - метод Parse()

using System;

class Program

{

static void Main()

{

long row = long.Parse("18");

long col = System.Int64.Parse(" 000123 ");

Console.WriteLine("row + col = " + (row + col));

double x = double.Parse(" -000,314159e+1");

Console.WriteLine("x = " + x);

Console.WriteLine("Double.Parse(\" 0011 \") = " +

Double.Parse(" 0011 "));

}

}

Обратите внимание, что метод Parse() является методом класса (статическим) и

поэтому в его вызове нужно указать имя того класса, из которого он взят. Имя

класса может быть или системным (в нашей программе System.Int64 и

System.Double), или принятым в языке C# (long, double).

Результат выполнения программы:

row + col = 141

x = -3,14159

Double.Parse(" 0011 ") = 11

В программе строки (строковые константы–литералы), использованные в

качестве аргументов метода Parse(), содержат ведущие и завершающие пробелы, а

также незначащие левые нули. Такие отклонения в строковых (символьных)

представлениях чисел считаются допустимыми. Следует обратить внимание н

а

запятую, отделяющую дробную часть числа от целой в символьном представлении.

Это требование локализации, предполагающей, что в России используются не

американские, а европейские правила записи вещественных чисел.

Примечание: В текстах программ на C# для отделения целой части вещественного

числа от ее дробной части используется точка. При вводе и выводе, то есть во

внешнем символьном представлении вещественных чисел, знак, разделяющий

дробную и целую части, определяется локализацией исполняющей системы.

Локализация может быть изменена настройкой.

При неверной записи числового или логического значения в аргументе метода

Parse() генерируется исключение с названием System.FormatException. Так как мы

еще не рассматривали механизм исключений, то примеры неудачных попыток

применять метод Parse() с такими ошибками в записи чисел приводить

преждевременно.

В .NET Framework 2.0 появился ещё один метод для преобразования

строкового представления значения (арифметического, символьного, логического) в

значение соответствующего простого типа. Этот метод перегружен и его варианты

есть в разных классах. Например, в класс целых чисел типа int входит вариант этого

метода с таким заголовком:

static public bool TryParse (string, out);

Метод анализирует строку, представленную первым параметром, и если её

удаётся преобразовать в целочисленное значение, то это значение передаётся в

точку вызова с помощью аргумента, заменяющего второй параметр. Кроме того

метод

имеет

возвращаемое

значение

логического

типа.

При

успешном

преобразовании возвращается значение true. При неверном представлении в строке-

аргументе значения соответствующего типа (того класса, для которого метод

вызван) метод возвращает значение false.

Принципиальное отличие метода TryParse()

"метод:метод TryParse()"

от

метода Parse() – отсутствие генерации исключений при неверных преобразованиях

.

Поэтому его можно использовать, не применяя механизма обработки исключений.

Чтобы привести пример, в котором будут показаны некоторые возможности

метода TryParse(), нам придётся несколько расширить тот арсенал средств,

которыми мы до сих пор пользуемся в примерах программ.

Начнём с модификатора out

"модификатор:модификатор out" , который

используется в спецификации второго параметра метода TryParse(). Таким

модификатором снабжается параметр, с помощью которого метод возвращает в

точку вызова некоторое значение. Аргумент, который будет подставлен на место

этого параметра, должен быть пригоден для получения возвращаемого значения, и

всегда снабжается в обращении к методу модификатором out. Таким аргументом

может быть имя переменной.

Наиболее часто метод TryParse() применяется для анализа входных данных,

вводимых пользователем с клавиатуры. Как мы уже показывали на примерах,

последовательность символов, набранную на клавиатуре, можно "прочитать" с

помощью метода

static public string Console.ReadLine();

Метод принадлежит классу Console. У метода ReadLine() параметры

отсутствуют.

Метод "срабатывает" как только пользователь нажимает на клавиатуре

клавишу ENTER. В точку вызова метод ReadLine() возвращает строку символов,

набранную на клавиатуре. Обращение к методу ReadLine() можно использовать в

качестве первого аргумента метода TryParse(). Вторым аргументом должна быть

переменная того типа, значение которого мы планируем "прочитать" из входной

строки.

Теперь, договорившись о новых средствах, приведём программу, которая

читает из входного потока консоли (от клавиатуры) последовательность (строку)

символов и анализирует её следующим образом. Если введено логическое значение

(true или false), то для true нужно вывести символ '1', а для false – символ '0'. Есл

и

введённая последовательность символов не является изображением логического

значения, то вывести знак '?'.

// 05_03.cs - Метод TryParse().

using System;

class Program

{

static void Main()

{

bool bb;

char res;

Console.Write("Введите логическое зачение: ");

res = (bool.TryParse(Console.ReadLine(), out bb) == true) ?

bb ? '1' : '0' : '?';

Console.WriteLine("res ===> " + res);

}

}

Результаты нескольких выполнений программы:

Введите логическое зачение: true<ENTER>

res ===> 1

Введите логическое зачение: false<ENTER>

res ===> 0

Введите логическое зачение: истина<ENTER>

res ===> ?

В программе используется статический метод TryParse() класса bool. Первый

аргумент – обращение к методу ReadLine() класса Console. Второй аргумент –

переменная булевого типа с именем bb. Обращение к TryParse() - это первый

операнд тернарной условной операции ?:. Если возвращаемое методом значение

равно true, то переменная bb получила одно из двух логических значений. В

зависимости от конкретного значения bb символьной переменной res присваивается

'1' или '0'. Если метод bool.TryParse() возвращает значение false, то переменная res

получает значение '?'.

Результаты нескольких выполнений программы дополняют приведённые

объяснения.

В каждый из классов, представляющих в C# простые (базовые) типы, входят

несколько открытых статических константных полей, позволяющих оценить

предельные значения переменных "переменная:предельные значения переменных"

и констант соответствующего типа.

В классах целых типов таких полей два:

MaxValue – максимальное допустимое значение (константа);

MinValue – минимальное допустимое значение (константа).

В классах вещественных типов, кроме названных, присутствуют следующие

статические константные поля:

Epsilon – наименьшее отличное от нуля числовое значение, которое может

принимать переменная заданного типа;

NaN – представление значения, которое не является числом, например, результат

выполнения операции при делении нуля на нуль;

NegativeInfinity – представление отрицательной бесконечности, например, при

делении отрицательного числа на нуль;

PositiveInfinity – представление положительной бесконечности, например, при

делении положительного числа на нуль.

В следующей программе выводятся значения перечисленных констант,

определенных в классах, соответствующих типам int и double.

// 05_04.cs – Константы и предельные значения

using System;

class Program

{

static void Main()

{

Console.WriteLine("int.MinValue = " + int.MinValue);

Console.WriteLine("int.MaxValue = " + int.MaxValue);

Console.WriteLine("double.MinValue = " + double.MinValue);

Console.WriteLine("double.MaxValue = " + double.MaxValue);

Console.WriteLine("double.Epsilon = " + double.Epsilon);

Console.WriteLine("double.NaN = " + double.NaN);

Console.WriteLine("double.PositiveInfinity = " +

double.PositiveInfinity);

Console.WriteLine("double.NegativeInfinity = " +

double.NegativeInfinity);

double zero = 0.0, value = 2.7172;

Console.WriteLine("value/zero = " + value / zero);

Console.WriteLine("0.0/zero = " + 0.0 / zero);

}

}

Результаты выполнения:

int.MinValue = -2147483648

int.MaxValue = 2147483647

double.MinValue = -1,79769313486232E+308

double.MaxValue = 1,79769313486232E+308

double.Epsilon = 4,94065645841247E-324

double.NaN = NaN

double.PositiveInfinity = бесконечность

double.NegativeInfinity = -бесконечность

value/zero = бесконечность

0.0/zero = NaN

Контрольные вопросы

Назовите две основные части платформы .NET Framework.

Что такое CIL(Common Intermediate Language)?

Укажите назначение общеязыковой спецификации CLS – Common Language

Specification?

Какие члены могут присутствовать в классе в соответстви с требованиями общей

системы типов CTS?

Какую функциональность обеспечивает класс Object объектам всех типов языка

C# ?

Приведите названия типов CTS, которые представлены в языке C# базовыми

типами, например, double.

Какие базовые типы языка C# не соответствуют CLS?

Назовите три метода, унаследованные любым типом языка C# от базового класса

Object?

Объясните возможности и ограничения метода Parse().

Объясните возможности метода TryParse().

Назовите члены базовых типов, позволяющие оценивать их предельные значения.

Соседние файлы в папке CSBasicCourse2ndedPodbelsky