C# MemoryStream:为什么在readByte之后转换为byte

C# MemoryStream:为什么在readByte之后转换为byte,c#,.net,memorystream,C#,.net,Memorystream,在中,您会注意到,在我们从内存流中读取一个字节后,它进入一个int,然后必须将其转换为byte。像.ReadByte()这样的函数一开始不返回字节,这让我感到奇怪。微软这样做有什么原因吗 // Read the remaining bytes, byte by byte. while(count < memStream.Length) { byteArray[count++] = Convert.ToByte(memStream.ReadByte()); } i、

在中,您会注意到,在我们从内存流中读取一个字节后,它进入一个int,然后必须将其转换为byte。像
.ReadByte()
这样的函数一开始不返回字节,这让我感到奇怪。微软这样做有什么原因吗

// Read the remaining bytes, byte by byte.
while(count < memStream.Length)
{
    byteArray[count++] =
        Convert.ToByte(memStream.ReadByte());
}

i、 e.你可以不用石膏来使用长度。这是一个足够好的理由吗?

我确信他们正在以一种非常好的方式将
int
转换为
byte
,因为
ReadByte()
返回一个int,并且他们的
byteArray
类型为
int[]

这不是特定于内存流的,相反,这是因为基类“流”的设计,其原因是

返回值:

强制转换为Int32的无符号字节,如果在流的末尾,则为-1


-使用
ReadByte
时,不能使用无符号字节表示1。如果读取成功,则流中的当前位置将前进一个字节。但是如果到达流的末端,它的设计返回-1

现在这将不是
字节的有效值(其无符号)

ms.Read(buf,0,lenth)
这里lenth是从流中读取的字节数,从
ReadByte
中得到的是第一个字节,它不能以这种方式使用,比如

byte[] buff = new byte[ms.Length];
ms.Read(buff , 0, buff .Length);

如果需要字节数组,则应选中
ToArray()
,并且只有在基于ReadTimeout的超时情况下才会返回-1?否,-1表示流结束,例如:您已在文件流上达到EOF,因此基本上使用单个值表示两种情况,即读取流或达到EOS。另一种实现方法是返回字节,但在EOF抛出异常的情况下,这会有它自己的问题。我注意到AsyncBeginRead。。。但对于ReadByte,超时是作为事件发生还是作为异常发生?我猜超时将作为异常发生。
byte[] buff = new byte[ms.Length];
ms.Read(buff , 0, buff .Length);