静态与非静态类成员
一般来说,我都是新手。 我有一个简短的问题 – 关于静态/非静态variables的最佳做法是什么?
我有一个variables,私人int x,属于类y。 要访问这个variables,我需要引用y。 如果x是静态的,但是我可以访问这个variables而不会引用y。
在y类中的几个方法将引用这个值的情况下,哪个是最好的方法?
希望这是有道理的,我的问题不是太基本!
非常感谢
你需要考虑静态variables属于类 ,而不是类的 实例 。
如果在类的所有实例中该variables应该是相同的,则使用静态variables。
如果没有,请使用实例variables。
通常情况下,公共静态variables是不好的做法 – 它是一个共享的全局资源,如果你改变它,你需要同步访问它。 拥有全球性的国家是你想尽可能避免的事情。
最佳实践是避免公共静态。 在OOP中,class级是为了隐藏其成员。 静态实际上不是实例的成员,而是types的成员。
如果你正在实现单例模式,静态方便。 但是,他们又需要通过公共财产实现私有化和可访问性。
您需要阅读静态类和静态类成员(C#编程指南) 。
你的select取决于你的架构。
Static
构成一个types的一部分,其他人构成该types的一个实例的一部分。 如果你想在同一types的不同实例之间有一些共享状态(比如说),使用static
。 如果您希望每个实例都有自己的值,独立于其他值,请使用instance
字段。
在这两种情况下,顺便说一句,避免暴露像公共fields
,但使用属性。
那么我不能确定地说一个更好,因为他们有不同的目的。
你是否熟悉OOP? 在OOP中,静态对象或类的成员可以直接从类访问,而非静态成员只能从它所属的实例访问。
C#遵循类似的方法原则。 静态方法可以直接从类中访问,而非静态方法(或者我喜欢调用它们的实例方法)必须从实例中访问。 这就是为什么需要对实例方法进行安装的原因,而对于静态方法则不需要,而且不切实际(见下文)。
在OOP中,静态variables用于不能被实例variables存储的值。 例如:假设你想保持一个类有多less个实例? 你将如何存储在一个单一的实例?
这些方法使用类似的原理。 他们应该用于在课堂上做不切实际的程序。 我倾向于将它们用于广泛的程序(而不是技术术语),这意味着那些不需要我实例化对象的程序。 例如,添加两个参数。 (这个用法可能不对,但我相信是这样)
但是,如果您想要添加对象的两个属性,则该方法不能是静态的,因为您将很快意识到,静态方法无法访问类中的实例方法或variables。 当然这是有道理的,因为这个静态方法不知道哪个类的实例,除非被告知,否则它不是这个实例的一部分,因为它不是实例本身的一部分)
为了不让事情更复杂,我会在这里停下来。 如果你误解了任何东西,请告诉我。
我完全同意奥德先生的观点 :
如果在类的所有实例中该variables应该是相同的,则使用静态variables。
如果没有,请使用实例variables。
是的,向类成员添加static
基本上意味着您可以在没有实例的情况下访问它,并且只能在任何实例之外访问它。 是的,如果你愿意的话,它会成为一个全球资源 ,甚至是一个全球variables 。
但我认为至less有另一个( 严重编辑 )好点在这里女佣…
使用静态成员作为全局variables不利于OOP
这意味着一旦你设置一个静态成员,你不能作为一个对象传递它。 你使用静态的全局variables越多, unit testing / 模拟 类就越困难。
有一个解决scheme, 单身人士 。 但他们不应该没有警告 !
另一方面,如果您确定您确实需要全局variables,请查看“ 工具箱”模式 。 这是Singleton模式的一个不是众所周知的扩展。 这实际上是未知的,如果你谷歌它不会find与这些关键字( 工具箱模式 )。
所以提前计划。 阅读更多。 了解每个选项,以便您可以更好地决定。 即使得到一本书。 面向对象的编程更多的是应用概念,从长远来看,这些概念可以帮助我们实现目标。
一般来说,如果你想有一个variables公共的,无论是静态的或实例,你必须把它包装在一个属性,并像这样公开。 这肯定是一个你会喜欢的原则。
但是,尽pipe其他一些答案,我不能说不使用静态。 静态不是你应该避免的恶魔。 你必须做的事情将决定你是否要使用静态的,只要你保持你的程序清洁和易于维护。
简单地说,而不是长辈的语言,静态代表不属于这个阶级的任何事例,但对他们有影响。 生成实例的类中的静态属性的一个例子是例如对于类的所有实例应该是全局的参数,以参与在实例内完成的计算。 对于这种情况,以我的观点,最好把这个因素声明为静态的,而不是每一个实例。 特别是如果这个因素改变你的程序的生命周期,影响下一次计算。
你需要自问一个问题:为什么我需要x是静态的?
如果使x变为静态,则意味着x是类A的所有对象的一部分,但是当x不是静态时,意味着x比仅仅是一个对象的一部分。
在静态字段的使用中,对于错误跟踪来说是痛苦的,但是在某些情况下这是非常有用的。
我build议你看看使用singelton http://en.wikipedia.org/wiki/Singleton