静态类可以在单个进程中多次实例化吗?

时间:2009-11-20 14:57:39

标签: c# multithreading

具有多个线程的单个进程是否可以多次创建静态类?

如果我只需要一个简单的构造,我可以使用静态类,还是必须使用单例?

6 个答案:

答案 0 :(得分:6)

是的,静态类可以充当类似单身的构造。它包含的所有静态成员只存在一次 - 但是每个AppDomain (请记住,一个进程可以有多个(隔离的).NET AppDomains)。

答案 1 :(得分:2)

  

单个进程可以有多个   线程导致静态类   创造了不止一次?

不,多个线程都指向同一个静态类。

  

如果我只需要一个简单的构造即可   我使用静态类,或者我必须这样做   诉诸单身人士?

不要理解你的问题。但一般来说,当您需要全局数据访问时,您使用Singleton。使用静态成员的静态类可以获得相同的功能。但这会使代码变得更加丑陋,因为有太多的静态关键字,如果你想放弃全局访问策略并使用更多的OOP方法,那么你的生活就会变得困难。

然而,与静态类相比,Singleton是一种更受欢迎的方法。

修改:您可能需要阅读此内容:static classes are not thread-safe

答案 2 :(得分:2)

我认为,当你说“创建”时,你的意思是“实例化”,实例化就是创建该类的对象。静态类永远不会被实例化。它们本质上是全局变量和函数的集合。

每个静态成员变量的一个实例在运行时创建,它们将在所有线程之间共享。

答案 3 :(得分:1)

  

单个进程可以有多个   线程导致静态类   创造了不止一次?

无论线程数量多少,在进程中获取多个静态.NET类(成员)实例的唯一方法是创建新的AppDomain。然后每个AppDomain都有一个静态类实例(成员)。

AppDomain Class @ MSDN

修改

我应该补充说,进程中的线程数和AppDomains的数量也是分开的。如果愿意,单线程进程可以创建任意数量的AppDomain。此外,只有程序流程是否有任何额外的线程调用其他AppDomain。这可能会造成多个线程正在访问静态类的多个实例的情况,但除非您自己明确创建此方案,否则不会发生这种情况。

  

如果我只需要一个简单的构造即可   我使用静态类,或者我必须这样做   诉诸单身人士?

似乎不清楚你在这里要问的是什么。静态类成员通过概念表示单例。如果您问这是否是创建简单构造的好方法,答案可能就是。这取决于您的需求。大多数人会争辩说你应该只使用常规的类定义并只创建一个实例。

考虑到你的两个问题,我推测你可能会问,是否可以通过使用静态类只创建一个实例作为单例。答案是肯定的,因为除非您的代码明确创建一个或者导入使用您的程序集创建新AppDomain的代码,否则您不会自动拥有新的AppDomain。

答案 4 :(得分:0)

您无法创建静态类的实例... 但是普通类的静态实例在所有线程上都是相同的

答案 5 :(得分:0)

  

具有多个线程的单个进程是否可以多次创建静态类?

Yes you can,虽然做某事(或者甚至想做)有点不寻常。它需要单独AppDomain或使用ThreadStaticAttribute。其中任何一个都会为您提供一个不与其他静态实例共享状态的单独实例。

  

如果我只需要一个简单的构造,我可以使用静态类,还是必须使用单例?

您可以使用其中之一。单例允许您使用静态类等非静态类,并为管理生命周期提供额外的灵活性。