静态局部变量是不好的做法吗?

Posted

技术标签:

【中文标题】静态局部变量是不好的做法吗?【英文标题】:Are static local variables bad practice? 【发布时间】:2011-08-13 01:55:27 【问题描述】:

C++相关问题:Static local variables in methods a bad practice?

在 VB.NET 中,当我想要一个简单的计数器或每次调用方法时递增的东西时,我经常会发现自己编写如下代码:

Private Sub tmrRefresh_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrRefresh.Tick

  Static a As Integer = 0
  a += 1
  '...rest of method depends on a

End Sub

这在 VB.NET 和 OOP 中是否普遍推荐?

【问题讨论】:

与 C++ 问题的答案相同。无论语言如何,所有 OOP 设计模式都将是相似的。 VB.NET 没有什么特别之处。 @Cody 但是其他问题的公认答案并不是特别好。 @Cody 很公平 - 我认为这两个编译器可能会以不同的方式对待它们 - 而且也无法从另一个问题中得到直接的答案。 现在旧了,但是@Cody:VB.Net 中的静态与 C++ 中的静态完全不同。它们是完全不同的概念。 VB.Net 对 C++ 的静态模拟是 Shared 【参考方案1】:

静态局部变量是不好的做法吗?

。静态局部变量在一个方面与非局部私有变量完全不同:它们的作用域更小。由于您总是希望范围尽可能小(= 更好的封装),因此局部静态变量可能优于私有变量。

另一方面,局部静态变量可能难以正确初始化。如果需要进行复杂的初始化(例如,如果您需要稍后重新初始化变量),则局部静态变量可能不合适。

【讨论】:

【参考方案2】:

我会推荐这个。

Visual Basic 中的静态意味着一个或多个已声明的局部变量在声明它们的过程终止后继续存在并保留其最新值。 参考:https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/modifiers/static

那么,你为什么要这样做?下次你进入这个 Sub 时,无论如何你都会重新初始化这个变量。我认为你甚至不能再访问它,除非你有这个类的第二个实例,如果两个实例同时运行,“a”的值可能会影响第二个中“a”的值实例。除非有意,否则将是灾难性的。正如前面的答案正确说明的那样 - 范围越小越好。

所以,除非我弄错了,否则这将是一个非常糟糕的做法。

【讨论】:

以上是关于静态局部变量是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

lua脚本有静态局部变量吗

java中静态成员变量、实例变量、局部变量何时创建、何时销毁?

java 局部静态变量在多线程环境下是不是有线程安全问题??

要同步哪些对象?为啥局部变量不好? [复制]

C语言中静态局部变量的问题

动态设置局部变量[重复]