这是未经测试的,因为我需要编写更多代码。但这是正确的,我觉得我错过了一些东西,比如这可以写得更好。我最后需要c.lose吗?我应该冲洗任何东西(如果我关闭(),我会假设不是吗?
Byte[] buffer;
using (var m = new MemoryStream())
{
using (var binWriter = new BinaryWriter(m))
{
foreach (var v in wordIDs)
binWriter.Write(v);
binWriter.Close();
}
buffer = m.GetBuffer();
m.Close();
}
答案 0 :(得分:4)
你不需要.Close()调用(使用块生成的自动.Dispose()处理那些)。
此外,您将要在MemoryStream上使用.ToArray(),而不是.GetBuffer()。 GetBuffer()返回底层缓冲区,无论它使用了多少。 ToArray()返回一个完美长度的副本。
如果您使用它与其他程序通信,请确保您和它同意字节的顺序(也就是字节顺序)。如果你正在使用网络字节顺序,你需要翻转字节的顺序(使用类似IPAddress.HostToNetworkOrder()),因为网络字节顺序是big-endian,而BinaryWriter使用little-endian。 / p>
答案 1 :(得分:2)
什么是wordIDs,它是枚举还是Int32 []?如果它只是Int32 []:
,您可以使用以下内容byte[] bytes = new byte[wordIDs.Length * 4];
Buffer.BlockCopy(wordIDs, 0, bytes, 0, bytes.Length);
否则,如果wordID是必须单步执行的枚举,则需要更改的是删除m.Close(如上所述)并使用MemoryStream.ToArray(如上所述)。
答案 2 :(得分:0)
这里不需要关闭。 using语句将确保在退出时调用这些类型的Dispose方法,这与调用Close具有相同的效果。事实上,如果你看一下反射器中的代码,你会发现两种情况下的Close都代表两种类型的Dispose方法。
答案 3 :(得分:0)
因此说Skeet:
没有真正的需要关闭 一个MemoryStream或一个BinaryWriter,但是 我认为使用一个使用是很好的形式 处理两者的声明 - 那 如果你以后改变的方式 使用真正 需要的东西 处置,它将适合相同 代码。
所以你不需要Close或using语句,但使用的是惯用的C#。
答案 4 :(得分:0)
JaredPar和Jonathan的回答都是正确的。如果您想要替代方案,请使用BitConverter.GetBytes(int)
。所以现在你的代码变成了这个
wordIDs.SelectMany(i => BitConverter.GetBytes(i));
答案 5 :(得分:0)
我不同意这里的Skeet。
虽然使用你可能不会需要关闭你依赖于BinaryWriter和MemoryStream的实现来在Dispose方法中为你做这件事。对于框架类型来说也是如此,但是如果有人写了一个没有这样做的Writer或Stream呢?
添加关闭不会造成伤害,并可以保护您免受错误编写的课程的影响。