Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# int[]到byte[],我忘了什么吗?_C# - Fatal编程技术网

C# int[]到byte[],我忘了什么吗?

C# int[]到byte[],我忘了什么吗?,c#,C#,这是未经测试的,因为我需要编写更多的代码。但这是正确的吗?我觉得我遗漏了一些东西,比如这本可以写得更好。我需要最后的c.lose吗?我应该冲洗任何东西吗(如果我关闭(),我将假定没有) 这里不需要关闭。using语句将确保在exit时调用这些类型上的Dispose方法,这与调用Close具有相同的效果。事实上,如果您查看reflector中的代码,您会发现在这两种情况下Close都只是代理这两种类型上的Dispose方法。您不需要.Close()调用(使用块生成的automatic.Dispos

这是未经测试的,因为我需要编写更多的代码。但这是正确的吗?我觉得我遗漏了一些东西,比如这本可以写得更好。我需要最后的c.lose吗?我应该冲洗任何东西吗(如果我关闭(),我将假定没有)


这里不需要关闭。using语句将确保在exit时调用这些类型上的Dispose方法,这与调用Close具有相同的效果。事实上,如果您查看reflector中的代码,您会发现在这两种情况下Close都只是代理这两种类型上的Dispose方法。

您不需要.Close()调用(使用块生成的automatic.Dispose()会处理这些调用)

此外,您还需要在MemoryStream上使用.ToArray(),而不是.GetBuffer()。GetBuffer()返回基础缓冲区,无论使用了多少缓冲区。ToArray()返回一个完美长度的副本

如果您使用它与另一个程序通信,请确保您和它在字节顺序(也称为endianness)上达成一致。如果您使用的是网络字节顺序,则需要翻转字节顺序(使用类似IPAddress.HostToNetworkOrder()的内容),因为网络字节顺序是大端,而BinaryWriter使用小端。

因此说:

也没必要关门 内存流或二进制编写器,但是 我认为使用“使用”是一种很好的形式 声明来处理这两个-即 如果您在以后的日期更改为 使用真正需要的东西 处理后,它将适合于相同的 代码


因此,您不需要Close或using语句,但using是惯用的C#。

什么是wordid,它是枚举还是Int32[]?如果仅为Int32[],则可以使用以下命令:

byte[] bytes = new byte[wordIDs.Length * 4];
Buffer.BlockCopy(wordIDs, 0, bytes, 0, bytes.Length);

否则,如果WordID是必须单步执行的枚举,则只需删除m.Close(如上所述)并使用MemoryStream.ToArray(如上所述)。

JaredPar和Jonathan的答案是正确的。如果您需要另一种选择,可以使用
BitConverter.GetBytes(int)
。现在你的代码变成了这样

wordIDs.SelectMany(i => BitConverter.GetBytes(i));

我不同意这里的双向飞碟

虽然您可能不需要使用closeby,但您依赖于BinaryWriter和MemoryStream的实现在Dispose方法中为您完成这项工作。这对于框架类型来说是正确的,但是如果有人编写了一个Writer或Stream却没有这样做呢


添加close不会对您造成伤害,并且可以保护您免受写得不好的类的攻击。

或者,如果您还需要翻转字节,您可以使用BitConverter.GetBytes(int)加上IPAddress.HostToNetworkOrder()。@Jonathan:我知道必须有一个函数才能做到这一点,我就是记不起它的名字了。你不需要保护自己不受还不存在的坏类的影响,我们所说的被称为坏编码,因为它毫无理由地增加了噪音。“如果有人做的事情不正确怎么办”并不是用冗余语句污染代码的好借口。除了它根本不会增加噪音之外,它更具表现力和具体性。防御性编程不是污染。Dispose()应始终关闭实现IDisposable的基于资源的类。如果没有,那么它就没有正确实现。
wordIDs.SelectMany(i => BitConverter.GetBytes(i));