2017-02-03 102 views
4

这是自从在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 

除非有人否则知道,上述相同的功能,除了一个事实,即 “私人”国旗暴露在课堂上其他地方使用。

问题开始静..等,以产生..

他们在哪里存储..它们真的创建和设置时等

显然,编译器将它们添加到数据堆(I知道这个词的不好用法)...但是在开销,垃圾回收等方面有没有惩罚。

通常我会避免他们像瘟疫,因为他们提出的问题比答案要多。

是否真的有任何使用静力学的固体原因?

PS:希望这传递SO问题测试...

注意我不是问如何创建静态细节..我更问如果有什么事情会让使用静态值得的。

附录....

我做了一点研究,发现这个相当有启发性。

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

+1

声明为静态的变量通常在类的所有实例中共享......此外,该变量的静态值与每个对象不唯一的对象无关。我认为静态作为一种常数... – Codexer

+1

可能的重复[什么时候在Visual Basic中创建静态变量?](http://stackoverflow.com/questions/12199698/when-is-a-static-变量在视觉基本创建) –

+4

嗯...没有@ Zaggler静态特定于实例。 –

回答

0

所以从研究,我想出了以下内容。

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

Konrad建议使用静态的主要原因是将变量的范围最小化到需要的地方。

所以......需要

  1. 使用简单的静态函数和子程序不常用的变量(布尔,整数等)时。如果你期望这个类的用户总是调用这个函数,并且期望这个类有1000个实例......那么你会添加很多开销。

  2. 切勿使用需要处理的对象类型的静态变量,除非您在例程中添加一些功能(参数),以便在Dispose模式下调用它,并记住在Dispose函数中这样做。

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

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

5

是否真的有任何理由去用不完静?

是的。在“单一责任原则”的第一个字母SOLIDS中有争议。在这种特殊背景下这是一个稍微不同的规则:

Objects should have the smallest possible scope.

如果不需要外部的范围X一个对象,它应该范围内X声明。这确保了它有一个单一的责任,并没有不恰当地访问其他地方。它也确保只有一个方法有责任访问这个对象。

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

这确实在我的经验中并不常见。但这是最佳做法。

(在性能/内存方面这两种变型也完全相同。)

+0

啊..很高兴认识后者。康拉德。是的,我同意这一点,但是,也有一些限制,尤其是如果你碰巧使用了比简单变量更复杂的东西,而这些变量超出了任何处理程序的范围。 –