c# Static or Non Static Class
我有一个C Windows窗体MP3播放器应用程序。我的resources文件夹中有音频文件,还有一个单独的"my audio"静态类,用于处理所有与音频相关的工作,如播放和增加音量等。从我的状态来看,我只是使用以下方法调用播放方法:
1 | MyAudio.Play(track); |
在MyAudio类中,我有一个WindowsMediaPlayer对象声明为:
1 |
我的问题是,在效率和内存使用量方面,将myaudio类声明为静态类还是非静态类更好?在窗体中创建myaudio类的对象,然后调用方法或直接使用类名调用是明智的吗?另外,将实例变量声明为静态变量是一个好的实践吗?
你的问题确实很宽泛,但在设计课程时,很少有设计原则可以考虑:
- 我是否需要对象及其在整个应用程序生命周期中的状态?
- 我需要维护类变量的状态以供将来使用吗
- 我需要在任何时候多线程或并行应用程序吗
- 我是否需要在将来分离组件并用于其他场景,如基于Ajax的Web场景?
在这种情况下,重要的是,您希望在应用程序生命周期内保持状态,并且内存使用量对于应用程序环境来说是可以的,因为在初始化之后,您将能够从内存中获取所有数据,并且不需要查询类似于源的数据库。但是,这对于需要初始化一次并在应用程序的其余部分中作为静态信息读取的场景是很好的。如果您计划重新查询信息,那么使用静态类型的部分目的将丢失。
假设将来需要并行代码以提高性能,那么静态代码会困扰您,因为它将在线程之间共享,并且总是需要一个同步构造,如锁、互斥锁,它将序列化所有线程,从而失去目标。在web/ajax场景中也会发生同样的事情,静态组件无法处理多个并行请求,并且在同步之前和除非同步,否则都会损坏。在这里,每个线程的实例变量是一个好处,因为它们在不需要锁的情况下进行任务/数据并行化,互斥
在我的理解中,静态是一种便利,许多程序员滥用它,通过避免实例变量并随意使用,而不理解其含义。从GC的角度来看,它不能收集静态变量,因此应用程序的工作集将一直增加到稳定为止,直到程序显式释放为止,不会减少,这对任何应用程序都不好,直到和除非我们存储数据以避免网络数据库调用。
理想的设计建议始终使用实例类,它被创建、工作并被释放,而不是逗留在周围。如果有信息需要从一个函数传递到另一个函数,就像在您的例子中一样,从播放到暂停再到停止,那么可以将数据持久化为静态变量,并以线程安全的方式进行修改,这是一种更好的方法。
如果我们以您给出的例子为例,因为它是一个windows窗体,执行类似play的操作,那么static就可以了,因为它是一个在系统上运行的可执行文件,但是对于测试来说,设想一个场景,您通过双击并在每个实例上播放来启动多个实例,通过按不同的操作,那么它们都将访问同一个静态对象,你可能会遇到一个损坏的问题,事实上,为了解决这种情况,你甚至可以选择你的类是singleton,在给定的时刻,内存中不能存在多个实例,就像Yahoo Messenger发生的那样,无论你点击多少次,总是会出现相同的实例。
没有静态实例变量。但是,如果静态成员与类的特定实例没有任何关系,那么定义它们是最佳实践。