我有一个c#windows forms mp3播放器应用程序。我在我的Resources文件夹中有一个音频文件和一个单独的" MyAudio"静态类,处理所有与音频相关的工作,如播放和增加音量等。 从我的表单中,我只使用以下方法调用play方法:
MyAudio.Play(track);
在MyAudio类中,我有一个声明为:
的WindowsMediaPlayer对象 private static WindowsMediaPlayer obj=new WindowsMediaPlayer();
我的问题是,在效率和内存使用量方面,将MyAudio类声明为静态还是非静态更好?在表单中创建MyAudio类的Object然后调用方法或使用类名直接调用是明智的吗? 将实例变量声明为静态也是一种好习惯吗?
答案 0 :(得分:2)
你的问题确实很广泛,但在设计课程时,你可以照顾的设计原则很少:
在这种情况下,重要的是你热衷于维护应用程序生命周期的状态,并且应用程序环境的内存使用量很好,因为在初始化之后你将能够从内存中获取所有数据并且不要不需要像数据库那样查询源代码。但是,这对于需要初始化一次并在应用程序的其余部分中作为静态信息读取的情况很有用。如果您打算重新查询信息,那么使用静态类型的部分目的将丢失
让我们假设您将来需要并行化代码以提高性能,然后静态将困扰您,因为它将在线程之间共享,并且总是需要像lock,mutex这样的同步构造,它将序列化所有线程因此目的就会丢失。在Web / Ajax场景中会发生同样的事情,并且您的静态组件无法处理多个并行请求,并且除非已同步,否则将被破坏。这里每个线程的实例变量是一个恩惠,因为它们执行任务/数据并行化而不需要锁,mutex
在我的理解中,静态是一种方便,许多程序员滥用,通过避免实例变量并随意使用,而不理解其含义。从GC的角度来看,它无法收集静态变量,因此应用程序的工作集总是会增加,直到它稳定下来,除非程序明确发布,否则不会减少,这对任何应用程序都没有好处,除非我们是存储数据以避免网络数据库调用。
理想的设计建议始终使用实例类,它将被创建,执行其工作并被释放,而不是徘徊。如果有需要从一个函数传递到另一个函数的信息,例如从Play到Pause to Stop,那么该数据可以保存为静态变量并以线程安全的方式进行修改,这是一种更好的方法< / p>
如果我们只是采取你给出的例子,因为它是一个窗口形式,它执行像Play这样的操作,那么静态就可以了,因为它是在系统上运行的可执行文件,但是对于测试想象一个你启动多个实例的场景通过双击并在每个操作上玩,通过按下不同的操作,然后他们都将访问相同的静态对象,你可能会遇到腐败问题,事实上为了解决这种情况你甚至可能选择你的类是单身,在一个在给定时刻内存中只能存在一个实例,就像雅虎信使一样,无论你点击多少次,总会出现相同的实例。
答案 1 :(得分:0)
没有静态实例变量。但是,如果静态成员不与该类的特定实例有任何关系,那么这是最佳实践。