gpt4 book ai didi

c# - 示例中的 CA2202 无效流

转载 作者:行者123 更新时间:2023-11-30 15:54:23 24 4
gpt4 key购买 nike

Microsoft 的文档中下面给出了使用流的示例。

Stream stream = null;  
try
{
stream = new FileStream("file.txt", FileMode.OpenOrCreate);
using (StreamWriter writer = new StreamWriter(stream))
{
stream = null;
// Use the writer object...
}
}
finally
{
if(stream != null)
stream.Dispose();
}

现在我想知道为什么要在使用 writer 对象之前设置 stream = null

最佳答案

CA2202 的标题是不要多次处理对象。我认为这是一个愚蠢的规则,因为 the description of IDisposable.Dispose()在这一点上非常清楚:

If an object's Dispose method is called more than once, the object must ignore all calls after the first one. The object must not throw an exception if its Dispose method is called multiple times.

所以这是一个关于非问题的规则,导致代码更复杂,白白! (请注意,我不是 onlyonly 那样的人)。

基本信息:StreamWriter类通常会Close()(相当于StreamDispose() code> 类)在 Close()/Dispose() 上,据说它拥有基本流的所有权。

基本问题是代码正常

using (stream = new FileStream("file.txt", FileMode.OpenOrCreate))
using (StreamWriter writer = new StreamWriter(stream))
{
}

Close()加倍(一次来自StreamWriter,一次来自外部using) ,这是不符合规则的。

所以我们想“手动”处理 streamDispose() if StreamWriter 没有t 取得了 stream 的所有权。

现在...“正常”异常可以由 FileStream 构造函数抛出(在这种情况下 stream 将为 null,因此没有什么可清除的),或者在 StreamWriter 构造函数中(在这种情况下,stream 将不是-nullwriter 将是 null,因此 stream 将需要处理,在 finally block 中完成)。在 StreamWriter 构造结束和 stream = null; 之间只能抛出异步异常,但我们将忽略它们。现在... StreamWriter 被构建并分配给 writer 之后,stream 可以被标记为“我们不需要处理它"(因为 StreamWriter 会为我们关闭它),所以 stream = null;。请注意,在 using ()stream = null; 之间放置其他行可能会创建其他抛出异常的点,例如:

using (StreamWriter writer = new StreamWriter(stream))  
{
if (something)
throw new Exception();

stream = null;
// Use the writer object...
}

但这会导致 FileStream 上出现双重 Dispose()

关于c# - 示例中的 CA2202 无效流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50623069/

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