Что за страности в Stream в.NET?
==================================

 Всем привет. Изучая потомков класса Stream наткнулся на одну интересную особенность, которая не дает мне покоя.  

Во-первых почему ReadByte() возвращает int? Выводя этот int на консоль, я что-то не заметил восьмеричной системы счисления.  

Во-вторых для чего Read() первым параметром получает массив байтов? Что должно быть в этом массиве? Что метод делает с этим массивом? Ни in ни out перед аргументом нет. 

**ReadByte** возвращает тип **int**, т.к. при достижении конца будет возвращено значение **минус один**. А тип **byte** может иметь значение в диапазоне от **нуля** до **255**. То есть, считывая байты, сообщить о достижении конца потока при помощи типа **byte** невозможно (байт, имеющий значение ноль может быть полезным байтом), поэтому используется тип **int**.  
  

Метод **Read** принимает буфер, в который будут помещены считанные данные. Буфер - это массив байт. Изначально он должен быть пустым. Размер массива - по своему смотрению. Чем больше размер буфера, тем больше данных будет помещено в память, меньше проделано операций.  
  

Метод **Read**  возвращает число помещенных в буфер байт. **Ноль** - достигнут конец потока.  
  

```
FileInfo f = new FileInfo(@"C:\example.dat");
using (FileStream fs = f.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
 using (BinaryReader br = new BinaryReader(fs))
 {
   int bytesRead = 0;
   byte[] buffer = new byte[256]; // размер буфера 256 единиц байт
   StringBuilder result = new StringBuilder();
   while ((bytesRead = br.Read(buffer, 0, buffer.Length)) != 0) // читаем не более 256 единиц байт в buffer
   {
     // из buffer следует извлекать не более bytesRead (в конце это число может быть меньше 255)
   }
 }
}
```
  

Массивы являются ссылочными типами и нет необходимости использовать **out**. 

 > Выводя этот int на консоль, я что-то не заметил восьмеричной системы счисления.  
  

А почему должны были? Значение числа оно всегда одинаково и не зависит от системы счисление. А вот его отображение может меняться. Можно даже пальцами показать, или узелками на веревке.  
  

> Во-вторых для чего Read() первым параметром получает массив байтов? Что должно быть в этом массиве? Что метод делает с этим массивом? Ни in ни out перед аргументом нет.  
  

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