首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >using block内部的C#语句返回null

using block内部的C#语句返回null
EN

Stack Overflow用户
提问于 2019-05-27 21:49:23
回答 1查看 118关注 0票数 2

我是C#新手,对下一个示例很好奇:

假设我们有这样的代码:

代码语言:javascript
复制
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();
}

和:

代码语言:javascript
复制
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

另一方面,下面的代码也按预期工作,这带来了更多的神秘性:

代码语言:javascript
复制
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();
   }
}
EN

回答 1

Stack Overflow用户

发布于 2019-05-27 22:09:37

您错误地理解了using语句的用法,在第一个示例中,由于您从未处理过MemoryStream,所以它按预期工作。而在第二条语句中,您在结束DeflateStream时立即释放MemoryStream

首先,你应该在它们完成后立即处理你的流,当我没有正确地处理它们时,我会得到混乱的结果。

现在,我将尝试解释您的错误所在,以及如何纠正这两个示例中的每一个,这两个示例与第三个示例相同(与第二个示例类似)。

第一个示例(解决方案):

代码语言:javascript
复制
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;
}

第二个示例(解决方案)相当于上面的代码:

代码语言:javascript
复制
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编写一行操作是一样的。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56327362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档