Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态与非静态类成员_C#_Oop_Class_Object_Static - Fatal编程技术网

C# 静态与非静态类成员

C# 静态与非静态类成员,c#,oop,class,object,static,C#,Oop,Class,Object,Static,我对c语言和编程都是新手。我有一个快速的问题-关于静态/非静态变量的最佳实践是什么 我有一个变量,private int x,它属于y类。要访问这个变量,我需要引用y。然而,如果x是静态的,我可以访问这个变量而不引用y 在类y中的几个方法将引用该值的情况下,哪种方法是最好的方法 希望这是有意义的,我的问题不是太基本 非常感谢最佳做法是避免公共静电干扰。在OOP中,类用于隐藏其成员。Static实际上不是实例的成员,而是类型的成员 如果您正在实现单例模式,那么Static很方便。但是,它们也需要私

我对c语言和编程都是新手。我有一个快速的问题-关于静态/非静态变量的最佳实践是什么

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

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

希望这是有意义的,我的问题不是太基本


非常感谢

最佳做法是避免公共静电干扰。在OOP中,类用于隐藏其成员。Static实际上不是实例的成员,而是类型的成员

如果您正在实现单例模式,那么Static很方便。但是,它们也需要私有化,并通过公共财产进入


您需要阅读。

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

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

如果不是,请使用实例变量


一般来说,使用公共静态变量是不好的做法,它是一个共享的全局资源,如果您更改了它,您需要同步对它的访问。拥有全局状态是您希望尽可能避免的事情。

您的选择取决于您的体系结构

Static
成为类型的一部分,其他人则成为该类型实例的一部分。如果希望在同一类型的不同实例之间具有某种共享状态(例如),请使用
static
。如果希望每个实例都有自己的值,独立于其他实例,请使用
instance
字段


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

通常,如果您想要有一个变量public,无论是静态的还是实例的,您必须将其包装在属性中并像那样公开它。这肯定是你喜欢遵循的原则

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


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

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

如果将x设为静态,则意味着x是a类所有对象的一部分,但如果x不是静态的,则意味着x仅是一个对象的一部分

在一般情况下,静态字段的使用对于错误跟踪来说是痛苦的,但在某些情况下这是非常有帮助的


我建议你看看singelton的用法,我不能肯定地说它更好,因为它们有不同的用途

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

C#在方法上遵循类似的原则。静态方法可以直接从类中访问,而非静态方法(或我喜欢调用的实例方法)必须从实例中访问。这就是为什么实例方法需要进行初始化,而静态方法则不需要,而且不实用(见下文)

在OOP中,静态变量用于实例变量无法存储的值。示例:假设您想记录一个类存在多少个实例?如何将其存储在单个实例中

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

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


为了不让事情进一步复杂化,我就到此为止。如果您误解了什么,请告诉我。

我完全同意以下观点:

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

如果不是,请使用实例变量

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

但我认为这里至少还有另一个()好的观点

使用静态成员作为全局变量不利于 这意味着一旦设置了静态成员,就不能将其作为对象传递。使用静态变量作为全局变量越多,对/ing来说就越困难

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

另一方面,如果你确定你真的需要g