средства "ввода-вывода" + обработка исключений

В си шарпе ввод-вывод основан на абстракции "поток данных". физически поток данных привязан к дискриптору файла или чему-то вроде того. ПОток - это абстракция для описания последовательных источников и приёмников данных.
Потоки межно перенаправлять , например в другую программы.
Конвейер - читает данные из источника и тут же записывает их в приёмник.
System.IO

Stream – базовый абстрактный класс для всех потоков

FileStream – класс для работы с файлами

MemoryStream – класс с интерфейсом потока для работы с данными в оперативной памяти

BufferedStream – класс-обертка над другим Stream’ом, чтобы буферизировать порции данных перед записью данных в основной поток или же буферизировать чтение данных из основного потока - обеспечивает ускоренное чтение данных.

Некоторые свойства:

public abstract bool CanRead; // можно ли читать , можно ли писать.
public abstract bool CanWrite;
public abstract bool CanTimeout;
public abstract bool CanSeek;
public abstract long Length; // длина потока в байтах
public abstract long Position;
public virtual int ReadTimeout; // возможная задержка на чтение
public virtual int WriteTimeout;

Некоторые методы:

public virtual void Close();
public abstract void Flush(); // обеспечивает физическую передачу данных на физическое устройствао. - три байта не пишутся на диск, а пишутся только когда блок достигает определенного размера - а этот метод позволяет записать любой объём на диск.
public abstract int Read(byte[] buffer, int offset, int count);
public int ReadByte();
public abstract long Seek(long offset, SeekOrigin origin);
public abstract void Write(byte[] buffer, int offset, int count);
public virtual void WriteByte(byte value);
----------------------------------
Классы-обертки над Stream
Класс Stream может оперировать только последовательностями (массивами) байт, читать и записывать другие типы данных в Stream неудобно

Для записи/чтения различных данных в поток/из потока реализованы классы-обертки над Stream:
Например эту штуку удобно использовать джля записи строк.
Бинарное представление данных:
BinaryWriter
BinaryReader

Текстовое представление данных:
StreamWriter – наследник TextWriter
StreamReader – наследник TextReader
-----------------------------------------
Пример -

// поток для записи
Stream stream = ...
...

// создание обертки
StreamWriter writer = new StreamWriter(stream);
// запись данных
writer.WriteLine("Hello, World!");
// окончание работы с оберткой
writer.Close();
-----------------------------------------
====================================

Раньше все функции проверки просто просто ради  возвращали параметр успешности своего выполнения.
  
  Механизм обработки в си шарп - -
-----------------
  try {
  // код, который может вызвать исключение
}
catch(Exception1 e) {
  // обработка исключения Exception1
}
…
catch(ExceptionN e) {
 // обработка исключения ExceptionN
}
finally {
  // действия, которые будут выполнены всегда
}
------------