静态类的范围是啥?
Posted
技术标签:
【中文标题】静态类的范围是啥?【英文标题】:What is the scope of a Static Class?静态类的范围是什么? 【发布时间】:2010-09-22 00:28:32 【问题描述】:我有一个程序集,一次可以由多个进程使用。如果我使用的是静态类,多个进程是否都使用该类的相同“实例”?
由于进程是分开的,它们会在不同的应用程序域下运行,因此静态“实例”是否分开?
这里的详细信息是该程序集由一个自定义 BizTalk 适配器使用,我将其设置为并行批处理消息。这就是我上面所说的“多进程”。
【问题讨论】:
【参考方案1】:每个应用程序域存在一次静态类。在您的情况下,这取决于适配器是在同一应用程序域中使用多个线程(因此共享静态类的单个实例)还是使用多个进程(因此具有静态类的单独实例)。
【讨论】:
【参考方案2】:多个线程将共享一个实例。出于这个原因,静态类可以方便地在线程之间传递状态,但您需要非常小心不要引入竞争条件(Monitor
或 lock
您的属性)。
但是,多个进程应该位于不同的 AppDomain 中,因此每个都有自己的实例。
【讨论】:
Web 应用程序怎么样。如果我使用来自两个其他单独程序集(DLL #2 和 DLL #3)的 DLL #1 中定义的相同静态类,即 #3 是网站应用程序,而 #2 是网站引用的 DLL,它们是否会共享相同的静态类价值观? @LordofScripts 是的,因为它们都在同一个 AppDomain 中【参考方案3】:静态类的范围仅限于应用程序域。每个应用程序域都将拥有自己可能拥有的任何静态变量的副本。如果您的“进程”是同一应用程序域中的线程,那么它们将共享静态值。但是,如果它们是实际独立的 Windows 进程,那么它们将具有不同的应用程序域,因此会有不同的副本。
【讨论】:
【参考方案4】:“我有一个程序集可能一次被多个进程使用。如果我使用的是静态类,多个进程是否都使用该类的相同“实例”?” em>
不,它们都有单独的实例。
“由于进程是分开的,它们会在不同的应用程序域下运行,因此静态“实例”是否分开?”
是的。
【讨论】:
【参考方案5】:您可能想查看单例模式。要点似乎是您要控制服务实例的数量。
我猜您需要一个单独的 dll/项目来服务所有客户端请求。您可以使用静态类/单例/多例来实现所需的功能。这实际上取决于您要完成的工作。
【讨论】:
以上是关于静态类的范围是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Fragments 作为静态内部类与独立公共类的设计逻辑是啥?
在 Web 应用程序中选择静态和实例数据访问类的优缺点是啥?
Java中静态和非静态内部类之间的非语法区别是啥? [复制]