gpt4 book ai didi

c# - System.Threading.Timer 和 CA1823 :AvoidUnusedPrivateFields

转载 作者:行者123 更新时间:2023-11-30 19:44:52 24 4
gpt4 key购买 nike

我收到此代码分析错误:CA1823:AvoidUnusedPrivateFields,对于这行代码:

private static Timer _timer;

在我的类的构造函数中,我有这个:

_timer = new Timer(OnTimerElapsed, _autoResetEvent, 1000, 1000);

我不需要在计时器上调用任何方法;简单地实例化它就足够了。这就是我收到 CA 警告的原因吗?在这种情况下,我真的只需要抑制错误,还是我遗漏了什么?

附带说明一下,我没有收到应该在计时器上调用 Dispose() 的错误。我不应该得到那个错误吗?

-- 编辑--

如果我将 _timer 设为一个实例字段,那么我会收到有关未对其调用 Dispose() 的错误。为什么静态与实例对此很重要?

最佳答案

您收到警告是因为您在分配给它后没有访问 _timer 变量。

之所以错误因变量是否为静态而不同,正是因为静态变量的性质。静态变量是类型 的一部分,而不是任何特定对象的一部分。它的生命周期与应用程序域的生命周期相关,而不是任何特定对象的生命周期。由于它的生命周期与应用程序域的生命周期相关,因此应用程序域的所有者负责计时器的清理。应用程序域的所有者是 CLR 本身,因此 CLR 将清理您的静态计时器。静态分析不会提示您不调用 Dispose,因为在卸载应用程序域时将调用计时器的终结器。

如果计时器是一个实例字段,它的生命周期将与拥有它的对象的生命周期相关联。在那种情况下,计时器的清理将由拥有对象负责。在 C# 中,此类对象成员清理是使用处置模式执行的。如果您尚未实现该模式(通过实现 IDisposable),VS 静态分析将发出警告。

话虽如此,计时器是 IDisposable 的特例。它们很特殊,因为即使您正在“使用”计时器(通过在其回调中执行代码),您也不会访问计时器对象本身。因此,您可能会想将 Timer 类视为一个服务。也就是说,您可能认为 Timer 构造函数更像是一个 RegisterForPeriodicCallbacks 方法。那是错的。 Timer 是一个对象,在 C# 中你必须这样对待它。您必须将 Timer 视为具有生命周期的对象,并且由其他某个对象确定。

如果您希望定时器的生命周期与应用程序的生命周期相关联,那么您应该制作一个 System.Timers.Timer 类型的静态变量,而不是 System.Threading .定时器。当您希望计时器开始计时时,只需调用其 Start 方法即可。

如果您希望计时器的生命周期与其他某个对象的生命周期相关联,那么您应该将其作为字段存储在其他容器对象中,并确保在容器对象上正确实现处置模式。

如果您执行其中任一操作,所有静态分析警告都会消失。

关于c# - System.Threading.Timer 和 CA1823 :AvoidUnusedPrivateFields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11658105/

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