gpt4 book ai didi

c# - 如何正确处理此代码?

转载 作者:太空宇宙 更新时间:2023-11-03 11:21:52 24 4
gpt4 key购买 nike

我有一个相当大的项目,我尽量保持干净整洁。当我在 Visual Studio 中运行代码分析器时,我收到一个可靠性错误,我觉得这很烦人。我真的很想学习如何解决它。这是我正在做的一个简化示例。

这是警告。

警告 1 CA2000:Microsoft.Reliability:在方法“MyExampleClassForStackOverflow.AddFeed(string)”中,在对对象“new FeedClassExamle()”的所有引用超出范围之前调用 System.IDisposable.Dispose。

这是我的示例代码:

class MyExampleClassForStackOverflow : IDisposable
{
public ConcurrentDictionary<string, FeedClassExamle> Feeds { get; set; }

public void AddFeed(string id)
{
//The warning is coming from this code block.
//In the full code, the feed classes collects data on a specific
//interval and feeds them back using events.
//I have a bunch of them and they need to be accessible so I
//store them in dictionaries using keys to effeciently find them.
Feeds.TryAdd(id, new FeedClassExamle());
Feeds[id].Start();
}
public void Dispose()
{
foreach (var item in Feeds)
item.Value.Dispose();
}
}

class FeedClassExamle : IDisposable
{
public void Start()
{

}
public void Dispose()
{

}
}

为了测试代码,使用:

using (var example = new MyExampleClassForStackOverflow())
{

}

欢迎提出任何建议。

最佳答案

存在警告是因为代码分析工具无法确定对象是否会被正确处置。您的代码编写方式实际上不会正确处置对象,但修复代码可能不会消除警告。

从根本上说,对于每个 AddFeed 方法,需要做的是确保某些东西会在它创建的每个 FeedClassExample 实例上调用 Dispose。最好的方法是避免创建一个 FeedClassExample 实例,如果一个实例已经存在于当前 ID 下的字典中。如果做不到这一点,AddFeed 方法应该处理它创建的任何 FeedClassExample 但随后决定不存储在字典中,或者与字典中的那个交换(我不确定 ConcurrentDictionary 支持哪些方法来做到这一点)然后 Dispose 旧方法。基本要求是,在实际执行 AddFeed 之外的任何时候,字典都将保存已创建但未销毁的 FeedClassExample 的所有实例。

在您的 FeedClassExample 类中添加一个析构函数可能会提供信息,它除了记录一条消息外什么都不做。如果您正确地对该类调用 Dispose,则析构函数将永远不会执行。如果您未能调用 Dispose,它会调用。因此,如果析构函数曾经执行过,您就会知道自己做错了什么。

关于c# - 如何正确处理此代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10674102/

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