Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O BufferedStream.WriteByte(Byte) método não executa mais uma liberação implícita quando o buffer interno está cheio. Essa alteração alinha o comportamento de BufferedStream.WriteByte com outros métodos na classe Write, como BufferedStream e BufferedStream.Write(Byte[], Int32, Int32), que não realizam um descarte implícito.
Versão introduzida
.NET 10
Comportamento anterior
Anteriormente, quando o buffer interno de um BufferedStream estava cheio, a chamada WriteByte liberava automaticamente o buffer para o fluxo subjacente. Esse comportamento era inconsistente com outros Write métodos em BufferedStream.
O exemplo a seguir demonstra o comportamento anterior:
StreamWithFlush streamWithFlush = new();
BufferedStream bufferedStream = new(streamWithFlush, bufferSize: 4);
// Write 4 bytes to fill the buffer
bufferedStream.WriteByte(1);
bufferedStream.WriteByte(2);
bufferedStream.WriteByte(3);
bufferedStream.WriteByte(4); // In .NET 9 and earlier, this caused an implicit flush
class StreamWithFlush : MemoryStream
{
public override void Flush()
{
Console.WriteLine("Flush was called.");
base.Flush();
}
}
Module PreviousBehaviorExample
Sub Example()
Dim streamWithFlush As New StreamWithFlush()
Dim bufferedStream As New BufferedStream(streamWithFlush, bufferSize:=4)
' Write 4 bytes to fill the buffer
bufferedStream.WriteByte(1)
bufferedStream.WriteByte(2)
bufferedStream.WriteByte(3)
bufferedStream.WriteByte(4) ' In .NET 9 and earlier, this caused an implicit flush
End Sub
Class StreamWithFlush
Inherits MemoryStream
Public Overrides Sub Flush()
Console.WriteLine("Flush was called.")
MyBase.Flush()
End Sub
End Class
End Module
Novo comportamento
A partir do .NET 10, o WriteByte método não executa mais uma liberação implícita quando o buffer interno está cheio. O buffer só é liberado quando o BufferedStream.Flush() método é explicitamente chamado ou quando o BufferedStream é descartado.
Tipo de mudança disruptiva
Essa alteração é uma mudança comportamental.
Motivo da alteração
O comportamento de liberação implícita de BufferedStream.WriteByte(Byte) era inconsistente com outros métodos, como Write e BufferedStream, da classe Write. Essa inconsistência pode levar a problemas de desempenho inesperados ou efeitos colaterais não intencionais ao trabalhar com fluxos sensíveis a operações de liberação. A remoção da descarga implícita garante um comportamento consistente em todos os métodos Write no BufferedStream.
Ação recomendada
Se o aplicativo depender do comportamento de liberação implícita de BufferedStream.WriteByte, atualize o código para chamar explicitamente o método Flush quando necessário. Por exemplo:
Before:
BufferedStream bufferedStream = new(new MemoryStream(), bufferSize: 4);
bufferedStream.WriteByte(1);
bufferedStream.WriteByte(2);
bufferedStream.WriteByte(3);
bufferedStream.WriteByte(4); // Implicit flush occurred here in .NET 9 and earlier
Dim bufferedStream As New BufferedStream(New MemoryStream(), bufferSize:=4)
bufferedStream.WriteByte(1)
bufferedStream.WriteByte(2)
bufferedStream.WriteByte(3)
bufferedStream.WriteByte(4) ' Implicit flush occurred here in .NET 9 and earlier
After:
BufferedStream bufferedStream = new(new MemoryStream(), bufferSize: 4);
bufferedStream.WriteByte(1);
bufferedStream.WriteByte(2);
bufferedStream.WriteByte(3);
bufferedStream.WriteByte(4);
bufferedStream.Flush(); // Explicit flush
Dim bufferedStream As New BufferedStream(New MemoryStream(), bufferSize:=4)
bufferedStream.WriteByte(1)
bufferedStream.WriteByte(2)
bufferedStream.WriteByte(3)
bufferedStream.WriteByte(4)
bufferedStream.Flush() ' Explicit flush