2009-11-20 133 views

回答

2

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

不,多个线程都将指向相同的静态类。

如果我只需要一个简单的构造可以 我用一个静态类,还是我要 再打单身?

不太明白你的问题。但是一般情况下,当你需要全局数据访问时,你使用Singleton。您可以使用静态成员与静态类相同的东西。但是这使得代码更丑陋,因为有太多的静态关键字,如果你想放弃全局访问策略并使用更多的OOP方法,就会让你的生活变得困难。

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

编辑:您可能需要阅读此:static classes are not thread-safe

+0

您已经回答了我的问题:) 对于我正在处理的特定问题,我需要在两个线程之间全局访问一个资源。我让他们用一个名为EventWaitHandle的信号互相发送信息,但是之后需要发送一个字符串到另一个字符串。我把它放在一个Queue中的静态类中,它被lock(){}保护,以便被另一个线程检索,但是不确定2个线程是否会得到相同的静态类。 – 2009-11-20 15:17:17

0

不能创建一个静态类... 但正常类的静态实例的实例,将超过所有线程相同

2

我觉得当你说“创建”你真的是指“实例化”,实例化是创建该类的一个对象。静态类永远不会实例化。它们本质上是全局变量和函数的集合。

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

+0

我不同意。任何尝试访问它们的静态类都会被实例化。他们有自己的静态构造函数,您可以在其中定义自己的逻辑。 – 2009-11-20 15:21:02

+0

尽管“静态构造函数”背后存在着令人奇怪且令人困惑的命名决定,但没有创建静态类的实例。该类正在被加载,初始化,使用,但* not *“实例化”。 – 2009-11-20 15:33:51

+0

+1 YES ...静态类未实例化。类型结构为您的应用程序中使用的每种类型创建一次,不是类型的实例或instaiation ...它是一个类型定义结构。 @myotherm,此类型结构(称为CORINFO_CLASS_STRUCT)包含Runtimetype信息。当一个对象被实例化时,对象头部包含一个指向这个东西的指针。 – 2009-11-20 15:35:33

6

是的静态类可以作为一个类似单例的构造。它包含的所有静态成员只会存在一次 - ,但是每个AppDomain(只要记住一个进程可以有多个(独立的).NET AppDomains)。

+2

不要忘记ThreadStaticAttribute。 – GvS 2009-11-20 15:16:29

+0

一个进程如何拥有超过1个AppDomain? – 2009-11-20 15:18:28

+0

+1,AppDomains。 – meklarian 2009-11-20 15:23:46

1

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

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

AppDomain Class @ MSDN

编辑:

我要补充的是在过程和应用程序域的数目的线程数是分开为好。如果需要,单线程进程可创建任意数量的AppDomain。此外,只有程序流程是否有任何额外的线程调用其他AppDomain。这可能会造成多线程访问静态类的多个实例的情况,但除非您自己明确创建此场景,否则不会发生这种情况。

如果我只需要一个简单的构造可以 我用一个静态类,还是我要 再打单身?

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

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

0

具有多个线程的单个进程是否会导致多次创建一个静态类?

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

如果我只是需要一个简单的构造,我可以使用静态类,或者我必须诉诸单身?

您可以使用。单例允许你像静态一样使用非静态类,并且为管理生命期提供了一些额外的灵活性。

相关问题