2014-10-22 120 views
0

我有一个c#windows窗体mp3播放器应用程序。我有我的资源文件夹和一个单独的“MyAudio”静态它处理喜欢玩和提高音量等 从我的表中的所有音频相关工作类的音频文件,我只是用调用play方法:c#静态或非静态类

MyAudio.Play(track); 

在MyAudio类,我声明为对象的WindowsMediaPlayer:

private static WindowsMediaPlayer obj=new WindowsMediaPlayer(); 

我的问题是,在效率和更少的内存使用方面,是它更好地申报MyAudio类为静态或非静态的?在表单中创建MyAudio类的对象,然后调用方法或直接使用类名调用是否明智? 将实例变量声明为静态也是很好的做法吗?

+2

你的问题有点宽泛。请记住,在使用静态类时,该对象将在应用程序的整个生命周期内存活。如果你在里面分配一个大的资源,它将一直存在。另外,'static'类往往不易测试。 – 2014-10-22 04:52:09

+0

因此,为了减少内存使用量,我应该将它们定义为非静态,并且每次只创建对象? – Chuker 2014-10-22 04:58:55

+0

这是我为这个特殊情况采取的方法。 – 2014-10-22 04:59:52

回答

2

你的问题确实是广泛的,但也有,你可以照顾,当你在设计一个类几个设计原则:

  • 我需要的对象,并在整个应用程序生命周期的状态
  • 我需要保持类变量的状态,以备将来使用
  • 我需要多线程或在时间
  • 我需要去耦元件在未来和其他使用的任何点并行化应用像基于Ajax的场景w eb场景

在这种情况下,重要的事情是您需要维护应用程序生命周期的状态,并且应用程序环境的内存使用量很好,因为初始化后您将能够获得所有来自内存的数据并且不需要像数据库那样查询源。但是,这对于需要初始化一次并在应用程序的其余部分中作为静态信息读取的情况非常有用。如果你打算重新查询信息,那么使用静态类型的部分目的将会丢失

假设将来你需要并行化你的代码以提高性能,那么静态将会困扰你,因为它将在线程之间共享,并且总是需要像锁,互斥体这样的同步构造,这会将所有线程串行化,因此目的将会丢失。在Web/Ajax场景中会发生同样的情况,并且您的静态组件无法处理多个并行请求,并且直到和未同步时都会损坏。这里每个线程的实例变量是一个福音,因为他们做任务/数据并行化,而不需要锁,互斥体

在我的理解中,静态是一种方便,许多程序员误用,避免实例变量和随意使用理解其含义。从GC的角度来看,它不能收集静态变量,所以应用程序的工作集合总是会增加,直到它稳定下来并且不会减少,除非程序明确发布,这对任何应用程序都是不利的,除非我们存储数据以避免网络数据库调用。

理想的设计会建议始终使用实例类,该实例类会被创建,完成其工作并被释放,而不会留在周围。如果有信息需要从一个函数传递到另一个函数(如从Play到Pause到Stop),那么可以将该数据保存到一个静态变量并以线程安全方式进行修改,这是一个更好的方法

如果我们只是举一个例子,因为它是一个Windows窗体,它执行像Play这样的操作,那么static会很好,因为它是一个在系统上运行的可执行文件,但对于测试来说,想象一下您启动多个实例通过按下不同的操作,然后他们都会访问相同的静态对象,你可能会遇到一个腐败问题,实际上为了解决这种情况,你甚至可以选择你的班级是单身人士,在给定的时间内,内存中不能存在多于一个实例,就像它发生在Yahoo Messenger上一样,不管你多少次都是这样k,总是有相同的实例出现。

+0

谢谢这么多:) – Chuker 2014-10-22 05:54:51

0

没有静态实例变量。然而,如果静态成员与类的特定实例无关,则最好定义静态成员。

+0

好的。因为我的WindowsMediaPlayer对象只是在MyAudio类中使用,所以我会声明它是非静态的。 – Chuker 2014-10-22 04:59:59

+0

问题是总是需要多少个实例...我想你需要一个......使之成为静态 – 2014-10-22 05:11:34

+0

而静态方法无法达到实例字段...至少不是直接 – 2014-10-22 05:13:09