Подтвердить что ты не робот

Как реализован метод Stream.CopyTo(Stream) в .NET 4?

Полезным удобством, представленным в .NET 4, является Stream.CopyTo(Stream [, Int32]), который считывает содержимое из текущего потока и записывает его в другой поток.

Это избавляет от необходимости немного утомительного кода, такого как этот:

public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[32768];
    while (true)
    {
        int read = input.Read (buffer, 0, buffer.Length);
        if (read <= 0)
            return;
        output.Write (buffer, 0, read);
    }
}

Так как у меня на этом компьютере нет .NET 4, мне было интересно, сможет ли кто-то, у кого установлен .NET 4, открыть Reflector и показать нам, как команда библиотеки классов Framework реализовала этот метод для .NET 4.

Сравните и сравните их реализацию с фрагментом кода выше. В частности, мне интересно узнать, какой размер буфера по умолчанию выбран.

4b9b3361

Ответ 1

В .NET 4.5.1 он использует фиксированный размер буфера 81920 байт. (В более ранних версиях .NET использовался фиксированный размер буфера 4096 байт, и, без сомнения, он будет продолжать меняться со временем.) Также существует перегрузка, где вы можете передать свой собственный размер буфера.

Реализация очень похожа на вашу, по модулю несколько перетасовки и некоторую проверку ошибок. Отражатель делает его сердцем следующим образом:

private void InternalCopyTo(Stream destination, int bufferSize)
{
  int num;
  byte[] buffer = new byte[bufferSize];
  while ((num = this.Read(buffer, 0, buffer.Length)) != 0)
  {
    destination.Write(buffer, 0, num);
  }
}

(Теперь вы можете увидеть фактический источник http://referencesource.microsoft.com/#mscorlib/system/io/stream.cs#98ac7cf3acb04bb1.)

Проверка ошибок в основном касается того, являются ли input.CanRead и output.CanWrite истинными, либо либо расположены. Поэтому в ответ на вопрос Benny это должно быть совершенно счастливым копирование из NetworkStream (или в записываемый NetworkStream).