gpt4 book ai didi

c# - 对象实例化是否必须发生在 using block 表达式中?

转载 作者:行者123 更新时间:2023-11-30 13:43:27 24 4
gpt4 key购买 nike

我想知道这段代码之间是否有区别:

// style 1
using (Stream stream_dst = File.Create("output.txt"))
using (Stream stream_src = File.OpenRead("input.txt"))
{
stream_src.CopyTo(stream_dst);
}

以及以下对象在外部打开的代码:

// style 2
Stream stream_output = File.Create("output.txt");
Stream stream_input = File.OpenRead("input.txt");

using (Stream stream_dst = stream_output)
using (Stream stream_src = stream_input)
{
stream_src.CopyTo(stream_dst);
}

using(...) 上下文中处理的对象是否也必须在 using(...) 表达式中实例化,或者它可以是在任何地方实例化,最后仍能得到妥善处理和关闭?

备注:这是一个教学问题,不是关于某人是否应该做某事,而是他们是否可以。具体来说,这两种方法之间是否存在差异。请牢记这一点。

最佳答案

这个:

using (Stream stream_dst = File.Create("output.txt"))
using (Stream stream_src = File.OpenRead("input.txt"))
{
stream_src.CopyTo(stream_dst);
}

与此相同:

using (Stream stream_dst = File.Create("output.txt"))
{
using (Stream stream_src = File.OpenRead("input.txt"))
{
stream_src.CopyTo(stream_dst);
}
}

两者都确保如果一个对象被创建它也将被释放。

在这种情况下:

Stream stream_output = File.Create("output.txt");
Stream stream_input = File.OpenRead("input.txt");

using (Stream stream_dst = stream_output)
using (Stream stream_src = stream_input)
{
stream_src.CopyTo(stream_dst);
}

stream_output 将被处置,因为您正在处置 stream_dst,它是同一个流。但是,如果在 using block 之前抛出异常,则 stream_output 将不会被释放。

using block 允许我们将创建/获取对象与确保其处置结合起来。如果 using block 在创建/获取对象之后,它仍然会处理它,但前提是在执行 using 语句之前没有抛出异常。我们通常不会将两者分开,因为将它们结合起来是使用的好处。

关于c# - 对象实例化是否必须发生在 using block 表达式中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56466136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com