在哪种情况下我不应该在类中使用静态成员?

时间:2013-04-18 23:02:07

标签: c# .net static

我不得不问这个问题,因为我觉得只有经验丰富的程序员才能知道班级中静态成员的优缺点。我读过有关静态成员的书籍,根据我的观点,我在项目中也使用了很多静态成员。

据我所知,如果某个类在我的项目中只使用了一次,我的意思是没有必要创建一些或多个实例,我应该使其所有成员都是静态的,尤其是静态方法。这是真的?这有另一个好处,因为可以轻松地调用静态成员,而无需在我们的类之间创建新实例或传递实例。

在我的项目中使用静态成员并没有告诉我它有什么问题,我的项目似乎运行正常,当然我并不是说我喜欢使用静态成员并经常随机使用它(因为我解释了我的观点)上面的观点)。我认为静态成员可能有一些优点和缺点(我不知道),我想从你的经验中知道。请与我分享。
谢谢!

4 个答案:

答案 0 :(得分:4)

  

据我所知,如果某个类在我的项目中只使用了一次,我的意思是没有必要创建一些或多个实例,我应该使其所有成员都是静态的,尤其是静态方法。这是真的吗?

可能是 - 有时候你想要一个实例而且它不能是静态的,因为它实现了一个接口 - 在这种情况下你会使用单例模式。

静态方法可能很有用,如果你的类不包含状态,那么可能性应该是静态类。

答案 1 :(得分:4)

查看以下帖子:

据我所知,如果某个类在我的项目中只使用了一次,我的意思是没有必要创建一些或多个实例,我应该使其所有成员都是静态的,尤其是静态方法。这是真的吗?

这取决于。我相信静态类是好的,如果你想在整个应用程序中全局访问它们(即实用程序类,辅助函数等)。

  

使用静态类来包含与a无关的方法   特别的对象。例如,创建一个常见的要求   不对实例数据起作用且未关联的方法集   到代码中的特定对象。你可以使用静态类   持有那些方法。

请记住,声明一个静态类允许它在应用程序的生命周期内保留在内存中。这意味着如果静态类仅使用一次,即使不需要/仍将再次使用,它仍将保留在内存中。相反,如果该类仅使用一次,那么最好创建一个常规类实例,以便GC在您使用它之后进行清理。

答案 2 :(得分:3)

静态问题的主要问题在于它使得多态性变得非常困难(在运行时将一个东西替换为另一个东西)。你经常想要这样做的地方是在编写测​​试时,我想用MockFileManager替换FileManager类。如果我使用非静态类,我只是使用接口来实现多态,并希望我使用IoC模式,我可以通过我的模拟实现来代替真实的(yay polymorphism!)。

但是,如果我的FileManager类都是静态的,那么很难用动态替换它。

注意:有代码分析规则可以告诉您出于性能原因而使事情变得静态。我关闭了这些规则。

答案 3 :(得分:2)

引用someone who can explain it way better than me

  

滥用静态类可被视为不良做法。但滥用任何语言功能也是如此。

     

我没有区分只有静态方法的静态类和静态类。它们实际上是相同的,除了静态类允许编译器强制执行开发人员意图(没有实例化此类,方便访问其功能的语法等)。

     

“Helper”类的激增会让你陷入困境(设计,可维护性,可读性,可发现性,其他能力......)。这里没有争论。但是,你能否认为“助手”课程永远不合适?我对此表示怀疑。

     

事实上,负责任地使用静态类可以为您的代码带来很多好处:

     

Enumerable静态类提供了一组我们大多数人都喜欢的扩展方法。它们是功能/业务逻辑的逻辑集合,与任何特定类型的实例无关。   环境/上下文提供的服务:例如,记录,配置(有时)   其他人(我现在想不到:))   所以不,一般来说,这不是一种不好的做法。明智地使用它们......

就我自己而言,当我需要使用它们时,我会使用它们,如果它看起来像是一种不好的做法并不重要。

经验法则?如果你知道为什么你应该使用静态并且可以解释它,那么你应该使用它。