【问题标题】:Scope of static class constructor and static class fields静态类构造函数和静态类字段的范围
【发布时间】:2013-02-05 11:11:39
【问题描述】:

我在一个解决方案中有 2 个控制台应用程序(Console1 和 Console2)。两个应用程序都引用一个类库 (CL)。 CL 包含一个静态类 (SC),其中包含每个构造函数设置的字段。

我的问题是,如果我在 Console1 中调用静态类,并且在第一次调用 Console1 的任何包含静态方法和字段的时候调用 SC 的构造函数并在 SC 中设置。现在,如果我同时运行 Console2,虽然是独立的,并且还访问 SC,那么静态类 SC 的确切范围是什么?在 Console1 中调用其构造函数等任何更改是否会对 SC 在 Console2 中使用时的行为方式产生任何影响?

【问题讨论】:

  • 不,第二个控制台应用程序将使用该静态类的另一个实例。没有危险

标签: c# scope static-classes


【解决方案1】:

范围是 AppDomain。

因为您有两个独立的进程,所以您有两个独立的 AppDomain 和两个独立的静态类“实例”。没有状态共享 - 根本没有。

【讨论】:

  • 太好了,回答了我所有的问题。顺便说一句,我以后在哪里可以检查,当我搜索“静态类 MSDN”时,我没有找到任何对范围的引用,至少我在以下页面上没有看到任何内容:msdn.microsoft.com/en-us/library/79b3xss3.aspx
  • @Freddy:嗯,首先,它记录在您链接的那个页面上:“静态构造函数只被调用一次,静态类在 的生命周期内保留在内存中您的程序所在的应用程序域。”。但它并没有真正突出,因为具有相同类的两个不同进程不共享任何状态是一个基本概念。这不仅限于 C#,在 C++、Java 等中也是如此。
  • 您的问题可能与静态类有关,但您得到的答案都将归结为:如果您运行一个项目的两个独立实例,则一个实例中使用的类不会与另一个实例交互。事实上,你可以运行同一个项目的两个实例,你不会有任何问题。
  • @DanielHilgarth,你是对的,我错了,错过了。 Kazuo,我在您自己的答案中发表了评论。
  • 我将您的答案标记为答案,因为您是第一个提到 AppDomain 的人,答案都非常相似(可能是由于我的琐碎问题 ;-)
【解决方案2】:

如果 Console1 和 Console2 像两个完全独立的 exe 文件一样独立运行,则会再次调用 SC 构造函数,否则不会。

【讨论】:

    【解决方案3】:

    控制台 1 和 2 作为单独的进程运行。程序集是按进程加载的(准确地说是按应用程序域),每个程序都会初始化静态构造函数等。因此,“程序集的运行实例”是完全独立的。

    【讨论】:

      【解决方案4】:

      您的问题可能与静态类有关,但您得到的答案都归结为: 如果您运行一个项目的两个单独实例,则一个实例中使用的类将不会与另一个实例交互。事实上,你可以运行同一个项目的两个实例,你不会有任何问题。 运行两个 Microsoft word 实例没有什么不同

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-28
        • 2011-10-07
        • 2018-01-12
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多