静态与非静态类成员

时间:2012-03-29 11:14:14

标签: c# oop class object static

我是初学者和编程人员。我有一个简单的问题 - 关于静态/非静态变量的最佳实践是什么。

我有一个变量private int x,它属于y类。要访问此变量,我需要引用y。如果x是静态的,我可以访问此变量而不引用y。

在类y中的几个方法将引用此值的情况下,哪种方法最好?

希望这是有道理的,我的问题不是太基本了!

非常感谢

7 个答案:

答案 0 :(得分:46)

您需要将静态变量视为属于,而不是属于该类的实例

如果在类的所有实例中此变量应该相同,请使用静态变量。

如果没有,请使用实例变量。

通常,公共静态变量是不良做法 - 它是共享的全局资源,如果您更改它,则需要同步对它的访问。拥有全球状态是你想要尽可能避免的事情。

答案 1 :(得分:7)

最佳做法是避免公开静电。在OOP中,类是为了隐藏其成员。静态实际上不是实例的成员,而是类型的成员。

如果要实现单例模式,静态会派上用场。但是,他们需要私有化,并通过公共财产进入。

您需要阅读Static Classes and Static Class Members (C# Programming Guide)

答案 2 :(得分:4)

我无法确切地说一个更好,因为它们有不同的用途。

你熟悉OOP吗?在OOP中,静态对象或类的成员可以直接从类中访问,而非静态成员只能从它所属的实例访问。

C#遵循类似的方法原则。静态方法可以直接从类访问,而非静态方法(或我喜欢调用它们的实例方法)必须从实例访问。这就是为什么需要对例如方法进行实例化的原因,而对于静态方法,它只是不需要,而且不切实际(见下文)。

在OOP中,静态变量用于实例变量无法存储的值。示例:假设您想要计算一个类的实例数量?你会如何将它存储在一个实例中?

这些方法使用了类似的原理。它们应该用于在类的实例中不切实际的过程。我倾向于将它们用于广泛的程序(不是技术术语),这意味着那些不需要我实例化对象的程序。例如,添加两个参数。 (这种用法可能也可能不正确,但我相信是这样)

但是,如果要添加对象的两个属性,则该方法不能是静态的,因为您很快就会意识到,静态方法无法访问类中的实例方法或变量。当然这是有道理的,因为静态方法不知道从哪个类获取这些实例,除非它被告知,因为它不是实例本身的一部分)

为了不再复杂化,我会停在这里。如果你误解了什么,请告诉我。

答案 3 :(得分:3)

您的选择取决于您的架构。

Static成为 Type 的一部分,其他人成为该类型的实例的一部分。如果您希望在相同类型的不同实例之间存在某些共享状态(例如),请使用static。如果您希望每个实例都拥有自己的值,而与其他实例无关,请使用instance个字段。

在这两种情况下,顺便说一下,避免像公开fields一样公开,但要使用属性。

答案 4 :(得分:1)

我完全赞同Oded先生:

  

如果在类的所有实例中此变量应该相同,请使用静态变量。

     

如果没有,请使用实例变量。

是的,将static添加到类成员基本上意味着您可以在没有实例的情况下访问它,并且只能在任何实例之外访问它。是的,它会变成全局资源,甚至是全局变量,如果你愿意的话。

但我认为这里至少还有另一个(heavily edited)好点......

使用静态成员作为全局变量反对OOP

这意味着一旦设置了静态成员,就无法将其作为对象传递。将static用作全局变量越多,unit testing / mock classes越难。

有一个解决方案,Singletons。但是他们永远不应该没有warnings

另一方面,如果你确定,你真的需要全局变量,请看一下 Toolbox模式。这是Singleton模式的一个鲜为人知的扩展。实际上它是如此未知,如果你谷歌它,你将找不到这些关键字(工具箱模式)。

所以提前计划。阅读更多。了解每个选项,以便您做出更好的决定。甚至拿一本书。面向对象编程更多的是应用概念,这些概念从长远来看有助于实现现在的工作。

答案 5 :(得分:0)

通常,如果您想要一个变量public(静态或实例),则必须将其包装在属性中并将其公开。这肯定是你会喜欢遵循的原则。

但是尽管有其他一些答案,我不能说不要使用静态。在任何情况下,静态都不是你应该避免的魔鬼。你要做的就是决定你是否要使用静电,只要你保持程序清洁和易于维护。

很容易说,而不是长老的语言,静态代表不属于这个类的任何实例但对它们有影响的东西。生成实例的类中的静态属性的示例例如是对于所有类的实例应该是全局的因子,以参与在实例内完成的计算。对于这种情况,并且在我看来,最好将此因子声明为静态而不是在每个实例中都有。特别是如果此因素在程序的生命周期中发生变化,从而影响下一次计算。

答案 6 :(得分:0)

你需要向自己提出一个问题:为什么我需要x是静态的?

如果你使x静态,则意味着x是A类所有对象的一部分,但是当x不是静态时,它意味着,而x只是一个对象的一部分。

在静态字段中使用静态字段对于错误跟踪很痛苦,但在某些情况下,这非常有用。

我建议您使用singelton http://en.wikipedia.org/wiki/Singleton

相关问题