Скачать презентацию Организация С системы ввода вывода С программы выполняют Скачать презентацию Организация С системы ввода вывода С программы выполняют

Лекция 10(ввод- вывод).ppt

  • Количество слайдов: 53

Организация С# системы ввода вывода С# программы выполняют операции ввода вывода посредством потоков. Поток Организация С# системы ввода вывода С# программы выполняют операции ввода вывода посредством потоков. Поток (stream) — это абстракция, которая либо выдает информацию, либо потребляет ее. Поток связывается с физическим устройством с помощью С# системы ввода вывода. Характер поведения всех потоков одинаков, несмотря на различные физические устройства, с которыми они связываются. Следовательно, классы и методы ввода вывода можно применить к устройствам разных типов.

Пространство имен System. IO Пространство имен System. IO

Класс Stream Байтовые классы потоков Класс Stream Байтовые классы потоков

Некоторые методы класса Stream • void close () Закрывает поток • void Flush () Некоторые методы класса Stream • void close () Закрывает поток • void Flush () Записывает содержимое потока в физическое устройство • int Read. Byte () Возвращает целочисленное представление следующего доступного байта потока • int Read (byte[ ] buf, int offset, int num. Bytes) читает num. Bytes байт в массив buf, начиная с элемента buf [offset] • long Seek (long offset, Seek. Origin origin) Устанавливает текущую позицию потока равной указанному значению смещения от заданного начала отсчета void Write. Byte (byte b) Записывает один байт в выходной поток • void write (byte [ ] buf, int offset, int num. Bytes) • Записывает поддиапазон размером num. Bytes байт из массива buf, начиная с элемента buf[offset]

Свойства, определенные в классе Stream • bool can. Read Свойство равно значению true , Свойства, определенные в классе Stream • bool can. Read Свойство равно значению true , если из потока можно считывать данные. Только для чтения • bool can. Seek Свойство равно значению true, если поток поддерживает функцию установки в заданную позицию. Только для чтения • bool Can. Write Свойство равно значению true, если в поток можно записывать данные. Только для чтения • long Length Свойство содержит длину потока. Только для чтения • long Position Свойство представляет текущую позицию потока. Для чтения и записи

Байтовые классы потоков Stream Buffered. Stream Memory. Stream File. Stream Байтовые классы потоков Stream Buffered. Stream Memory. Stream File. Stream

Класс Buffered. Stream • Используется для буферизованных потоковых операций чтения и записи (но не Класс Buffered. Stream • Используется для буферизованных потоковых операций чтения и записи (но не той и другой одновременно) в другой поток. • Создает буфер в памяти (по умолчанию размер буфера равен 4 Кбайт, но это значение может быть изменено с помощью перегруженного конструктора), который используется для кэширования данных. • В результате повышается производительность операций чтения и записи — за счет сокращения числа обращений к функциям операционной системы.

Buffered. Stream рекомендации Buffered. Stream может быть скомпонован для работы с определенными типами потоков. Buffered. Stream рекомендации Buffered. Stream может быть скомпонован для работы с определенными типами потоков. Он предоставляет реализации операций чтения и записи байтов в базовый источник данных или репозиторий. Используйте объекты Binary. Reader и Binary. Writer для чтения и записи других типов данных. Buffered. Stream позволяет предотвратить замедление ввода и вывода, если в буферизации нет необходимости. При постоянном чтении и записи блоков, размер которых превышает размер внутреннего буфера, Buffered. Stream может даже не выделять место под внутренний буфер. Buffered. Stream также буферизует чтение и запись в совместно используемый буфер. При работе с этим классом предполагается осуществление серий операций чтения или записи с редким переключением между этими двумя видами операций.

Класс Memory. Stream Используется для создания потока, содержимое которого хранится в памяти. Задействует байтовый Класс Memory. Stream Используется для создания потока, содержимое которого хранится в памяти. Задействует байтовый массив, который может иметь либо фиксированную, либо произвольную длину. В последнем случае мы можем изменять размер массива, читать из него и записывать в него. Что касается потока с фиксированной длиной, то в него мы можем только записывать.

Использование класса Memory Stream Не всегда удобно выполнять операции ввода вывода непосредственно с помощью Использование класса Memory Stream Не всегда удобно выполнять операции ввода вывода непосредственно с помощью физического устройства. Иногда полезно считывать входные данные из массива или записывать их в массив. В этом случае стоит воспользоваться классом Memory. Stream. Класс Memory. Stream — это реализация класса Stream, в которой для операций ввода вывода используются массивы байтов. Конструктор этого класса: Memory. Stream(byte[] buf)

Свойства и методы Для того чтобы выяснить число байтов, выделенных под поток в памяти, Свойства и методы Для того чтобы выяснить число байтов, выделенных под поток в памяти, мы пользуемся свойством Capacity. Свойство Length возвращает реальное число байтов в потоке Метод Get. Buffer() возвращает массив байтов, в котором располагается поток. Для сохранения всего содержимого потока в байтовом массиве используется метод To. Array(). Метод Write. To(Stream) служит для копирования всего потока в другой поток.

Символьные классы потоков В вершине иерархии символьных потоков находятся абстрактные классы Text. Reader и Символьные классы потоков В вершине иерархии символьных потоков находятся абстрактные классы Text. Reader и Text. Writer. Класс Text. Reader предназначен для обработки операций ввода данных Класс Text. Writer — для обработки операций вывода данных. Методы, определенные этими двумя абстрактными классами, доступны для всех их подклассов. Следовательно, они образуют минимальный набор функций ввода вывода, который будут иметь все символьные потоки.

Text. Reader Stream. Reader применяется для чтения последовательности символов из указанного файла или другого Text. Reader Stream. Reader применяется для чтения последовательности символов из указанного файла или другого потока. String. Reader служит для чтения символов из строк.

Пример try { string line = null; System. IO. Text. Reader read. File = Пример try { string line = null; System. IO. Text. Reader read. File = new Stream. Reader("C: \csharp. net informations. txt"); while (true) { line = read. File. Read. Line(); if (line != null) { Message. Box. Show (line); } } read. File. Close(); } catch (IOException ex) { Message. Box. Show(ex. To. String()); }

Text. Writer Text. Writer

Производные классы Stream. Writer применяется для вывода последовательности символов в той или иной кодировке. Производные классы Stream. Writer применяется для вывода последовательности символов в той или иной кодировке. По умолчанию используется экземпляр класса UTF 8 Encoding для записи символов в кодировке Unicode UTF 8. String. Writer используется для записи строки Indented. Text. Writer позволяет делать отступ новой строки с помощью строкового маркера табуляции.

Двоичные потоки Класс Binary. Reader предоставляет механизмы для чтения примитивных типов как бинарных значений. Двоичные потоки Класс Binary. Reader предоставляет механизмы для чтения примитивных типов как бинарных значений. Он содержит методы для чтения каждого типа, определенного в Common Type System — Read. Boolean, Read. Byte (Read. Bytes), Read. Char (Read. Chars), Read. Decimal, Read. Double и т. д. Класс Binary. Writer для записи данных примитивных типов в ассоциированный поток. Основной метод для записи Write(…)

Файловый ввод вывод на побайтовой основе Чтобы создать байтовый поток с привязкой к файлу, Файловый ввод вывод на побайтовой основе Чтобы создать байтовый поток с привязкой к файлу, используйте класс File. Stream. Класс File. Stream — производный от Stream и потому обладает функциональными возможностями базового класса. Объекты File. Stream поддерживают произвольный доступ к файлам с использованием метода Seek позволяет перемещать положение чтения и записи в любое место внутри файла. Смещение в байтах относительно точки ссылки поиска, которая может располагаться в начале, в текущем положении или в конце файла, определяется тремя свойствами класса Seek. Origin.

Как открыть и закрыть файл Чтобы создать байтовый поток, связанный с файлом, создайте объект Как открыть и закрыть файл Чтобы создать байтовый поток, связанный с файлом, создайте объект класса File. Stream. В классе File. Stream определено несколько конструкторов. Чаще всего из них используется следующий: File. Stream(string filename, File. Mode mode) Здесь элемент filename означает имя файла, который необходимо открыть, причем оно может включать полный путь к файлу. Элемент mode означает, как именно должен быть открыт этот файл, или режим открытия. Элемент mode может принимать одно из значений, определенных перечислением File. Mode

Значения перечисления File. Mode Значение Описание File. Mode. Append Добавляет выходные данные в конец Значения перечисления File. Mode Значение Описание File. Mode. Append Добавляет выходные данные в конец файла File. Mode. Create Создает новый выходной файл. Существующий файл с таким же именем будет разрушен File. Mode. Create. New Создает новый выходной файл. Файл с таким же именем не должен существовать File. Mode. Open Открывает существующий файл File. Mode. open. Or. Create Открывает файл, если он существует. В противном случае создает новый File. Mode. Truncate Открывает существующий файл, но усекает его длину до нуля

Пример public static void Main() { File. Stream fs=new File. Stream( Пример public static void Main() { File. Stream fs=new File. Stream("c: \Variables. txt", File. Mode. Append, File. Access. Write, File. Share. Write); fs. Close(); Stream. Writer sw=new Stream. Writer("c: \Variables. txt", true, Encoding. ASCII); string Next. Line="This is the appended line. "; sw. Write(Next. Line); sw. Close(); } }

Считывание байтов из объекта класса Filestream В классе File. Stream определены два метода, которые Считывание байтов из объекта класса Filestream В классе File. Stream определены два метода, которые считывают байты из файла: Read. Byte. O и Read (). Один байт, используйте метод int Read. Byte () При обнаружении конца файла метод возвращает 1. Метод может генерировать исключения типов Not. Supported. Exeption (поток не открыт для ввода) и Object. Disposed. Exception (поток закрыт). Чтобы считать блок байтов, используйте метод int Read(byte[] buf, int offset, int num. Bytes) Он возвращает количество успешно считанных байтов. При возникновении ошибки ввода вывода генерируется исключение типа l. OException.

Пример class Show. File { public static void Main(string[] args) { int i; File. Пример class Show. File { public static void Main(string[] args) { int i; File. Stream fin; try { fin = new File. Stream(args[0], File. Mode. Open); } catch(File. Not. Found. Exception exc) { Console. Write. Line(exc. Message) ; return; } catch(Index. Out. Of. Range. Exception exc) { Console. Write. Line(exc. Message); return;

Пример оконч. // Считываем байты пока не встретится EOF. do { try { i Пример оконч. // Считываем байты пока не встретится EOF. do { try { i = fin. Read. Byte(); } catch(Exception exc) {Console. Write. Line(exc. Message); return; } if(i != 1) Console. Write((char) i); } while(i != 1); fin. Close(); }

Запись в файл void Write. Byte(byte val) Этот метод записывает в файл байт, заданный Запись в файл void Write. Byte(byte val) Этот метод записывает в файл байт, заданный параметром val. При возникновении во время записи ошибки генерируется исключение типа l. OException. Если соответствующий поток не открыт для вывода данных, генерируется исключение типа Not. Supported. Exception. С помощью метода Write() можно записать в файл массив байтов: • void Write(byte[] buf, int offset, int num. Bytes)

Формы записи в файл При выполнении операции вывода в файл выводимые данные зачастую не Формы записи в файл При выполнении операции вывода в файл выводимые данные зачастую не записываются немедленно на реальное физическое устройство, а буферизируются операционной системой до тех пор, пока не накопится порция данных достаточного размера, чтобы ее можно было всю сразу переписать на диск. Такой способ выполнения записи данных на диск повышает эффективность системы. Например, дисковые файлы организованы по секторам, которые могут иметь размер от 128 байт. Данные, предназначенные для вывода, обычно буферизируются до тех пор, пока не накопится такой их объем, который позволяет заполнить сразу весь сектор.

Формы записи в файл 2 Но если вы хотите записать данные на физическое устройство Формы записи в файл 2 Но если вы хотите записать данные на физическое устройство вне зависимости от того, полон буфер или нет, используйте метод void Flush() В случае неудачного исхода операции записи генерируется исключение типа IOException. Завершив работу с выходным файлом, вы должны его закрыть с помощью метода Close (). Это гарантирует, что любые данные, оставшиеся в дисковом буфере, будут переписаны на диск. Поэтому перед закрытием файла нет необходимости специально вызывать метод Flush ().

Запись данных в файл пример using System; using System. IO; class Write. To. File Запись данных в файл пример using System; using System. IO; class Write. To. File { public static void Main(string[] args) { File. Stream fout; try {fout = new File. Stream('test. txt", File. Mode. Create); } catch(IOException exc) { Console. Write. Line(exc. Message +"Ошибка "); return; try { for(char с = 'А’; с <= ‘Z; с++) fout. Write. Byte((byte) с); } catch(IOException exc) { Console. Write. Line(exc. Message +"Ошибка при записи в файл. "); fout. Close(); }

Использование класса Filestream для копирования файла File. Stream fin; File. Stream fout; try{ // Использование класса Filestream для копирования файла File. Stream fin; File. Stream fout; try{ // open input file try {fin = new File. Stream(args[0], File. Mode. Open); } catch (File. Not. Found. Exception exc) { Console. Write. Line(exc. Message + "n. File Not Found"); Stream 1. Wait. Of. Console(); return; }

Продолжение // open output file try {fout = new File. Stream(args[1], File. Mode. Create); Продолжение // open output file try {fout = new File. Stream(args[1], File. Mode. Create); } catch (IOException exc) { Console. Write. Line(exc. Message + "n. Error Opening Output File"); Wait. Of. Console(); return; } } catch (Index. Out. Of. Range. Exception exc) {Console. Write. Line(exc. Message + "n. Usage: Copy. File From To"); Wait. Of. Console(); return; }

Конец // Copy File try { do { i = fin. Read. Byte(); if Конец // Copy File try { do { i = fin. Read. Byte(); if (i != 1) fout. Write. Byte((byte)i); } while (i != 1); } catch (IOException exc) { Console. Write. Line(exc. Message + "File Error"); Wait. Of. Console(); } fin. Close(); fout. Close();

Файловый ввод вывод символов Символьные потоки работают непосредственно с Unicode символами (это их достоинство). Файловый ввод вывод символов Символьные потоки работают непосредственно с Unicode символами (это их достоинство). Поэтому, если вы хотите сохранить Unicode текст, лучше всего выбрать именно символьные потоки. В общем случае, чтобы выполнять файловые операции на символьной основе, поместите объект класса File. Stream внутрь объекта класса Stream. Reader или класса Stream. Writer. Эти классы автоматически преобразуют байтовый поток в символьный и наоборот. Помните, что на уровне операционной системы файл представляет собой набор байтов. Использование классов Stream. Reader или Stream. Writer не влияет на этот факт. Класс Stream. Writer — производный от Text. Writer, a Stream. Reader — производный от Text. Reader. Следовательно, классы Stream. Writer и Stream. Reader имеют доступ к методам и свойствам, определенным их базовыми классами.

Класс Stream. Writer Чтобы создать выходной поток для работы с символами, поместите объект класса Класс Stream. Writer Чтобы создать выходной поток для работы с символами, поместите объект класса Stream (например, File. Stream) в объект класса Stream. Writer В классе Stream. Writer определено несколько конструкторов. Самый популярный из них: Stream. Writer(Stream stream) Здесь элемент stream означает имя открытого потока. Этот конструктор генерирует исключение типа Argument Exception, если поток stream не открыт для вывода, и исключение типа Argument. Null. Exception, если поток имеет null значение. Созданный объект класса Stream. Writer автоматически выполняет преобразование символов в байты.

Пример string str; File. Stream fout; try { fout = new File. Stream( Пример string str; File. Stream fout; try { fout = new File. Stream("test. txt", File. Mode. Create); } catch(IOException exc Console. Write. Line(exc. Message + "Cannot open file. "); return ; } Stream. Writer fstr_out = new Stream. Writer(fout); Console. Write. Line("Enter text ('stop' to quit). "); do { Console. Write(": "); str = Console. Read. Line(); if(str != "stop") { str = str + "rn"; // add newline try { fstr_out. Write(str); } catch(IOException exc) { Console. Write. Line(exc. Message + "File Error"); return ; } } } while(str != "stop");

Рекомендация Иногда удобнее открывать файл с помощью класса Stream. Writer. Для этого используйте один Рекомендация Иногда удобнее открывать файл с помощью класса Stream. Writer. Для этого используйте один из следующих конструкторов: Stream. Writer(string filename) Stream. Writer(string filename, bool append. Flag) Элемент filename означает имя открываемого файла, причем имя может включать полный путь к файлу. Во второй форме используется параметр append. Flag типа bool: если append. Flag равен значению true , выводимые данные добавляются в конец существующего файла. В противном случае заданный файл перезаписывается. В обоих случаях, если файл не существует, он создается, а при возникновении ошибки ввода вывода генерируется исключение типа IOException (также возможны и другие исключения).

Использование класса Stream. Reader string str; // Open a file using Stream. Writer fstr_out; Использование класса Stream. Reader string str; // Open a file using Stream. Writer fstr_out; try { fstr_out = new Stream. Writer("test. txt"); } catch(IOException exc) { Console. Write. Line(exc. Message + "Cannot open file. "); return ; } Console. Write. Line("Enter text ('stop' to quit). "); do { Console. Write(": "); str = Console. Read. Line(); if(str != "stop") { str = str + "rn"; // add newline try { fstr_out. Write(str); } catch(IOException exc) { Console. Write. Line(exc. Message + "File Error"); return ; } } } while(str != "stop"); fstr_out. Close();

Считывание и запись двоичных данных Для считывания и за писи двоичных значений встроенных С# Считывание и запись двоичных данных Для считывания и за писи двоичных значений встроенных С# типов используйте классы Binary. Reader и Binary. Writer. Важно понимать, что эти данные считываются и записываются с ис пользованием внутреннего двоичного формата, а не в текстовой форме, понятной человеку.

Класс Binary. Writer представляет собой оболочку для байтового потока, которая управляет записью двоичных данных. Класс Binary. Writer представляет собой оболочку для байтового потока, которая управляет записью двоичных данных. Его наиболее употребительный конструктор имеет следующий вид: Binary. Writer(Stream output. Stream) Здесь элемент output. Stream означает поток, в который будут записываться данные. Чтобы записать выходные данные в файл, можно использовать для этого параметра объект, созданный классом File. Stream. Если поток output. Stream имеет null значение, генерируется исключение типа Argument. Null. Exception, а если поток output. Stream не открыт для записи, — исключение типа Argument. Exception.

Методы вывода информации, определенные в классе Binary. Writer void write (sbyte val) Записывает byte Методы вывода информации, определенные в классе Binary. Writer void write (sbyte val) Записывает byte значение со знаком void write (byte val) Записывает byte значение (без знака) void write (byte [ ] buf) Записывает массив byte значений void write (short vai) Записывает целочисленное значение типа short (короткое целое) void write (ushort vai) Записывает целочисленное ushort значение (короткое целое без знака) void write (int vai) Записывает значение типа int void write (uint vai) Записывает целочисленное uint значение (целое без знака) void write (long vai ) Записывает целочисленное значение типа long (длинное целое) ……. .

Класс Binary. Reader • Класс Binary. Reader представляет собой оболочку для байтового потока, которая Класс Binary. Reader • Класс Binary. Reader представляет собой оболочку для байтового потока, которая управляет чтением двоичных данных. Его наиболее употребительный конструктор имеет такой вид: Binary. Reader(Stream. input. Stream) Здесь элемент input. Stream означает поток, из которого считываются данные. Чтобы выполнить чтение из файла, можно использовать для этого параметра объект, созданный классом File. Stream. Если поток input. Stream имеет null значение, ге нерируется исключение типа Argument. Null. Exception, а если поток input. Stream не открыт для чтения, — исключение типа Argument. Exception.

Пример Binary. Writer data. Out; Binary. Reader data. In; int i = 10; double Пример Binary. Writer data. Out; Binary. Reader data. In; int i = 10; double d = 1023. 56; bool b = true; try { data. Out = new. Binary. Writer(new File. Stream("testdata", File. Mode. Create)); } catch (IOException exc) {Console. Write. Line(exc. Message + "n. Cannot open file. "); return; }

Пример 3 catch (IOException exc) { Console. Write. Line(exc. Message + Пример 3 catch (IOException exc) { Console. Write. Line(exc. Message + "n. Write error. "); } data. Out. Close(); Console. Write. Line(); // Now, read them back. try { data. In = new Binary. Reader(new File. Stream("testdata", File. Mode. Open)); } catch (File. Not. Found. Exception exc) { Console. Write. Line(exc. Message + "n. Cannot open file. "); return; }

Пример 2 try { Console. Write. Line( Пример 2 try { Console. Write. Line("Writing " + i); data. Out. Write(i); Console. Write. Line("Writing " + d); data. Out. Write(d); Console. Write. Line("Writing " + b); data. Out. Write(b); Console. Write. Line("Writing " + 12. 2 * 7. 4); data. Out. Write(12. 2 * 7. 4); }

Пример 4 try { i = data. In. Read. Int 32(); Console. Write. Line( Пример 4 try { i = data. In. Read. Int 32(); Console. Write. Line("Reading " + i); d = data. In. Read. Double(); Console. Write. Line("Reading " + d); b = data. In. Read. Boolean(); Console. Write. Line("Reading " + b); d = data. In. Read. Double(); Console. Write. Line("Reading " + d); } catch (IOException exc) { Console. Write. Line(exc. Message + "Read error. "); } data. In. Close();

Файлы с произвольным доступом До сих пор мы использовали последовательные файлы, т. е. файлы, Файлы с произвольным доступом До сих пор мы использовали последовательные файлы, т. е. файлы, доступ к содержимому которых организован строго линейно, байт за байтом. Но в С# также возможен доступ к файлу, осуществляющийся случайным образом. В этом случае необходимо использовать метод Seek(), определенный в классе File. Stream. Этот метод позволяет установить индикатор позиции (или указатель позиции) в любое место файла. Заголовочная информация о методе Seek () имеет следующий вид: long Seek(long new. Pos, Seek. Origin origin)

Seek Элемент origin может принимать одно из значений, определенных перечислением Seek. Origin. Begin Поиск Seek Элемент origin может принимать одно из значений, определенных перечислением Seek. Origin. Begin Поиск от начала файла Seek. Origin. Current Поиск от текущей позиции Seek. Origin. End Поиск от конца файла

Пример file. Stream f; char ch; try { f = new File. Stream( Пример file. Stream f; char ch; try { f = new File. Stream("random. dat", File. Mode. Create); } catch (IOException exc) { Console. Write. Line(exc. Message); return; }

Пример 2 // Write the alphabet. for (int i = 0; i < 26; Пример 2 // Write the alphabet. for (int i = 0; i < 26; i++) { try { f. Write. Byte((byte)('A' + i)); } catch (IOException exc) { Console. Write. Line(exc. Message); return; } }

Пример 3 try { f. Seek(0, Seek. Origin. Begin); // seek to first byte Пример 3 try { f. Seek(0, Seek. Origin. Begin); // seek to first byte ch = (char)f. Read. Byte(); Console. Write. Line("First value is " + ch); f. Seek(1, Seek. Origin. Begin); // seek to second byte ch = (char)f. Read. Byte(); Console. Write. Line("Second value is " + ch); f. Seek(4, Seek. Origin. Begin); // seek to ? th byte ch = (char)f. Read. Byte(); Console. Write. Line("Fifth value is " + ch); Console. Write. Line(); // Now, read every other value. Console. Write. Line("Here is every other value: ");

Пример 4 for (int i = 0; i < 26; i += 2) { Пример 4 for (int i = 0; i < 26; i += 2) { f. Seek(i, Seek. Origin. Begin); // seek to ith double ch = (char)f. Read. Byte(); Console. Write(ch + " "); } } catch (IOException exc) { Console. Write. Line(exc. Message); } Console. Write. Linee(); f. Close();

Преобразование числовых строк во внутреннее представление С# не обеспечивает метод ввода, который бы считывал Преобразование числовых строк во внутреннее представление С# не обеспечивает метод ввода, который бы считывал и преобразовывал строковые представления числовых значений во внутренний двоичный формат. Для решения этой задачи имеется метод, определенный для всех встроенных числовых типов, — Parse ()

С# тип и. NET тип Пространство имен System(eg System. Int 32) . NET имя С# тип и. NET тип Пространство имен System(eg System. Int 32) . NET имя структуры C# имя Decimal decimal Double double Single float Int 16 short Sbyte sbyte

Parse и Try. Parse Для структур определены методы, которые способствуют полной интеграции типов значений Parse и Try. Parse Для структур определены методы, которые способствуют полной интеграции типов значений в С# иерархию объектов. Cтруктуры также определяют статические методы, которые преобразуют числовую строку в соответствующий двоичный эквивалент. string s = "42"; int 32 n; n = Int 32. Parse(s); Методы Parse () генерируют Format. Exception. Если строка, которая конвертируется не всегда число: if(!Int 32. Try. Parse(s, out n)) { //обработка, если не число } Метод. Try. Parse() возвращает булевское значение обозначающее произошло ли преобразование и возвращает преобразованное значение в out параметре.