Vb.net 静态还是私有

Vb.net 静态还是私有,vb.net,Vb.net,从VB编程的第一天起,这就是我一直在思考的问题之一。关于这个问题,我有自己的想法,但我想知道关于使用静态变量的普遍共识是什么 静态变量: Public Function Whatever() as Boolean Static Flag as Boolean If not Flag then ' do something Flag = True end if Return Something End sub Private

从VB编程的第一天起,这就是我一直在思考的问题之一。关于这个问题,我有自己的想法,但我想知道关于使用静态变量的普遍共识是什么

静态变量:

Public Function Whatever() as Boolean
     Static Flag as Boolean
     If not Flag then
        ' do something
        Flag = True
     end if
     Return Something
End sub
Private Flag as Boolean
Public Function Whatever() as Boolean
     If not Flag then
        ' do something
        Flag = True
     end if
     Return Something
End sub
VS:

私有变量:

Public Function Whatever() as Boolean
     Static Flag as Boolean
     If not Flag then
        ' do something
        Flag = True
     end if
     Return Something
End sub
Private Flag as Boolean
Public Function Whatever() as Boolean
     If not Flag then
        ' do something
        Flag = True
     end if
     Return Something
End sub
除非有人知道其他情况,否则上述函数在功能上是等价的,不同于“Private”标志公开用于类中的其他地方

静力学开始出现问题。。像

它们存放在哪里。。它们是何时真正被创造和处置的

显然,编译器以某种方式将它们添加到类的数据堆中(我知道,这个词的用法很糟糕)。。。但是,在开销、垃圾收集等方面是否有惩罚

一般来说,我会像躲避瘟疫一样避开它们,因为它们提出的问题多于答案

真的有什么充分的理由使用静力学吗

PS:希望这能通过问题测试

注意,我并不是在询问有关如何创建静态的细节。。我更想问的是,如果有什么东西能让使用静态文件变得值得的话

附录……

我做了更多的研究,发现这很有启发性

真的有什么充分的理由使用静力学吗

对。可以说,它出现在:s的第一个字母中,代表“单一责任原则”。在这种特殊情况下,这是一个稍微不同的规则:

如果一个对象在范围X之外不需要,它应该在范围X之内声明。这确保了它有一个单一的责任,并且不会在其他地方被不正确地访问。它还确保只有一个方法负责访问此对象

因此,在您的例子中,最好的方法是将变量设置为函数静态(=局部)变量,而不是对象私有变量

这在我的经验中确实相当罕见。但这是最佳实践


(就性能/记忆而言,这两种变体完全相同。)

因此,通过研究,我得出以下结论

静态变量是“惰性”变量,因为它们是在第一次调用函数或例程时需要时创建的。有一个与创建相关的开销,更重要的是,第一次初始化是为了使其线程安全

正如康拉德所说,使用静力学的主要原因是将变量的范围最小化到需要的地方

所以。。。必要时

  • 在不太常用的函数和子例程中使用简单的静态变量(布尔、整数等)。如果您希望该类的用户始终调用该函数,并且希望该类有1000个实例。。。你增加了很多开销

  • 永远不要使用需要释放的对象类型的静态变量,除非您向例程添加了一些功能(参数),允许您在Dispose模式下调用它,并记住在classes Dispose函数中这样做

  • 同样,不要使用静态变量作为对项目中其他对象的引用。这样做可以防止所述对象在代码的其他地方被垃圾收集,因为它仍然被引用

  • 最后,如果改为使用私有变量方法,请为其指定一个名称,以表明该变量正用于该函数。。e、 g.统计半时得分


  • 声明为静态的变量通常在类的所有实例中共享。。。此外,变量的静态值与对象无关,在这些对象中,变量对于每个对象都不是唯一的。我认为静态在某种程度上是一个常数…可能是这个的复制品。。。没有@Zaggler statics是实例特定的。@Zaggler您必须区分静态局部变量(OP正在谈论的)和静态非局部(实例级)变量。但无论如何,静态变量都不是常量,也不应被视为常量(尽管非局部静态变量是否应该是可变的是另一个问题,也是另一个棘手的问题)。MSDN:
    在共享过程中声明静态变量时,整个应用程序只能使用静态变量的一个副本。。。当在非共享的过程中声明静态变量时,该类的每个实例只能使用该变量的一个副本啊。。很高兴认识后者。康拉德。是的,我同意这一点,但是,也有局限性,特别是如果你碰巧使用了比简单变量更复杂的东西,这将超出任何处理程序的范围。