C# c静态或非静态类

C# c静态或非静态类,c#,winforms,audio,static,non-static,C#,Winforms,Audio,Static,Non Static,我有一个c windows窗体mp3播放器应用程序。我的资源文件夹中有音频文件,还有一个单独的MyAudio静态类,它处理所有与音频相关的工作,如播放和增加音量等。 从我的表单中,我只使用以下方法调用play方法: MyAudio.Play(track); 在MyAudio类中,我将WindowsMediaPlayer对象声明为: private static WindowsMediaPlayer obj=new WindowsMediaPlayer(); 我的问题是,就效率和更少的内存

我有一个c windows窗体mp3播放器应用程序。我的资源文件夹中有音频文件,还有一个单独的MyAudio静态类,它处理所有与音频相关的工作,如播放和增加音量等。 从我的表单中,我只使用以下方法调用play方法:

 MyAudio.Play(track);
在MyAudio类中,我将WindowsMediaPlayer对象声明为:

 private static WindowsMediaPlayer obj=new WindowsMediaPlayer();
我的问题是,就效率和更少的内存使用而言,将MyAudio类声明为静态还是非静态更好?明智的做法是在表单中创建MyAudio类的对象,然后调用方法还是直接使用类名调用?
将实例变量声明为静态也是一种好做法吗?

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

您的问题确实很广泛,但在设计类时,您可以考虑的设计原则很少:

在整个应用程序生命周期中,我是否需要对象及其状态 我是否需要维护类变量的状态以备将来使用 我需要在任何时候多线程或并行化应用程序吗 我是否需要在将来将组件解耦并用于其他场景,如基于Ajax的web场景 在这种情况下,重要的是您希望维护应用程序生命周期的状态,并且内存使用量对于应用程序环境来说是合适的,因为在初始化之后,您将能够从内存中获取所有数据,而不需要查询像数据库这样的源。但是,对于需要初始化一次并在应用程序的其余部分作为静态信息读取的场景,这是很好的。如果您计划重新查询信息,那么使用静态类型的部分目的将丢失

假设将来您需要并行化代码以提高性能,那么静态代码将困扰您,因为它将在线程之间共享,并且始终需要一个同步构造,如锁、互斥,它将序列化所有线程,因此目的将丢失。在Web/Ajax场景中也会发生同样的情况,静态组件无法处理多个并行请求,并且在同步之前或除非同步,否则会损坏。在这里,每个线程的实例变量是一个福音,因为它们在不需要锁和互斥锁的情况下执行任务/数据并行化

在我的理解中,静态是一种方便,许多程序员滥用它,避免使用实例变量,随意使用,而不理解其含义。从GC的角度来看,它无法收集静态变量,因此应用程序的工作集将不断增加,直到稳定为止,并且在程序明确释放之前不会减少,这对任何应用程序都不好,除非我们存储数据以避免网络数据库调用

理想的设计会建议始终使用实例类,该类被创建、执行其工作并被发布,而不是徘徊。如果有信息需要从一个函数传递到另一个函数,比如从播放到暂停再到停止,那么数据可以持久化到静态变量,并以线程安全的方式进行修改,这是一种更好的方法


如果我们仅以您给出的示例为例,因为它是一个windows窗体,可以执行诸如播放之类的操作,那么静态就可以了,因为它是一个在系统上运行的可执行文件,但对于测试,请想象一个场景,您通过双击并在每个实例上播放,通过按不同的操作来启动多个实例,然后他们都会访问同一个静态对象,你可能会遇到损坏问题,事实上,为了解决这种情况,你甚至可能会选择你的类作为singleton,在给定的时刻,内存中只能存在一个实例,就像Yahoo messenger一样,无论你点击多少次,总是会出现同样的情况。

你的问题有点宽泛。请记住,在使用静态类时,对象将在应用程序的整个生命周期中都有效。如果你在里面分配一个大的资源,它会一直存在。而且,静态类往往不太容易测试。所以为了减少内存使用,我应该将它们定义为非静态类,每次只创建对象?这就是我在这种特殊情况下所采用的方法。好的。因为我的WindowsMediaPlayer对象只是在MyAudio类中使用的,所以我将声明它为非静态的。问题总是你需要多少实例。。。我想你需要一个。。。使静态和静态方法无法到达实例字段。。。至少不是直接的