静态或私人

时间:2017-02-03 15:05:49

标签: 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

VS

私人变量:

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

除非有人知道,否则上述内容在功能上是等同的,除了“私人”标志暴露在课堂其他地方使用的事实。

Statics开始出现问题......比如..

他们存放在哪里..什么时候真正创造和处置等

显然,编译器会以某种方式将它们添加到数据堆(我知道,这个词的用法不当)......但是在开销,垃圾收集等方面是否会受到惩罚。

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

是否真的有任何SOLID理由使用静力学?

PS:希望这通过SO问题测试...

注意我并没有询问有关如何创建静态的详细信息。我更想问的是,如果ANYTHING使用静态值得做什么。

附录....

我做了一些研究,发现这很有启发性。

https://weblogs.asp.net/psteele/7717

2 个答案:

答案 0 :(得分:5)

  

是否真的有任何SOLID理由使用静力学?

是。对于“单一责任原则”,可以说是SOLID S 的第一个字母。在这个特定的背景下,它是一个稍微不同的规则:

  

Objects should have the smallest possible scope.

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

因此,在您的情况下,最好的想法是将变量设置为函数静态(=局部)变量而不是对象私有变量。

根据我的经验,这确实相当罕见。但这是最好的做法。

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

答案 1 :(得分:0)

因此,从研究中我得出以下结论。

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

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

所以......必要时

  1. 在不太常用的函数和子例程中使用SIMPLE静态变量(布尔值,整数等)。如果您希望该类的用户始终调用该函数,并期望该类的实例有1,000个......那么您将增加很多开销。

  2. 永远不要使用需要处理的对象类型的静态变量,除非您向例程添加一些功能(参数),允许您在Dispose模式下调用它,并记住在Dispose函数类中执行此操作。

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

  4. 最后,如果您使用私有变量方法,请为其指定一个名称,以明确该变量正用于该函数。 stat_Half_Time_Score