我是C#新手,对下一个示例很好奇:
假设我们有这样的代码:
private static byte[] Compress(byte[] data)
{
var output = new MemoryStream();
using (var deflateStream = new DeflateStream(output, CompressionLevel.Fastest))
{
deflateStream.Write(data, 0, data.Length);
}
return output.ToArray();
}
和:
private static byte[] Compress(byte[] data)
{
using (var output = new MemoryStream())
using (var deflateStream = new DeflateStream(output, CompressionLevel.Fastest))
{
deflateStream.Write(data, 0, data.Length);
return output.ToArray();
}
}
第一个示例按预期工作,而后一个示例仅返回null。using
在内部是如何工作的?我希望它能像简单的try/finally一样工作,但它似乎在调用toArray
之前关闭了MemoryStream
。
另一方面,下面的代码也按预期工作,这带来了更多的神秘性:
private static byte[] Decompress(byte[] payload)
{
using(var inputStream = new MemoryStream(payload))
using(var outputStream = new MemoryStream())
using (var deflateStream = new DeflateStream(inputStream, CompressionMode.Decompress))
{
deflateStream.CopyTo(outputStream);
return outputStream.ToArray();
}
}
发布于 2019-05-27 22:09:37
您错误地理解了using语句的用法,在第一个示例中,由于您从未处理过MemoryStream,所以它按预期工作。而在第二条语句中,您在结束DeflateStream时立即释放MemoryStream
首先,你应该在它们完成后立即处理你的流,当我没有正确地处理它们时,我会得到混乱的结果。
现在,我将尝试解释您的错误所在,以及如何纠正这两个示例中的每一个,这两个示例与第三个示例相同(与第二个示例类似)。
第一个示例(解决方案):
private static byte[] Compress(byte[] data)
{
var output = new MemoryStream();
using (var deflateStream = new DeflateStream(output, CompressionLevel.Fastest))
{
deflateStream.Write(data, 0, data.Length);
}
var ret = output.ToArray();
output.Dispose();
return ret;
}
第二个示例(解决方案)相当于上面的代码:
private static byte[] Compress(byte[] data)
{
byte[] ret;
using (var output = new MemoryStream())
{
using (var deflateStream = new DeflateStream(output, CompressionLevel.Fastest))
{
deflateStream.Write(data, 0, data.Length);
ret = output.ToArray();
}
}
return ret;
}
在第二个例子中,我添加了括号,这样你就能理解你到底在用one做什么,这与你在if语句中为true或false编写一行操作是一样的。
https://stackoverflow.com/questions/56327362
复制相似问题