【问题标题】:Is static context always single in C#?静态上下文在 C# 中总是单一的吗?
【发布时间】:2015-01-30 11:58:13
【问题描述】:

我有一个库,里面有一个静态字段。我想创建一个应用程序并引用这个库,所以我有这个静态字段的两个实例。 .Net 运行时不允许两次引用同一个库,但我想知道是否有可能克服这个限制?

我不能更改库,但我可以复制/重命名它。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    这并不像你想象的那么疯狂。事实上,您可以使用AppDomains 来实现这一点。

    每个AppDomain 都有自己的静态变量存储位置。因此,您可以在进程中创建第二个 AppDomain,并使用继承自 MarshalByRefObject 的对象在它们之间进行通信,例如在 this MSDN example 中。

    【讨论】:

    • 我喜欢你的回答,能否请你提供一些甜蜜的 LoC :)
    • @Jeremy the MSDN link from my answer有一个使用代理的完整跨应用程序域通信示例。
    • 这可能不是疯狂,但它确实对我来说是一个“糟糕的架构警报”。
    【解决方案2】:

    虽然 AppDomains 上的 Lucas' suggestion 可以工作,但您也可以使用泛型创建此效果,因为具有不同泛型类型参数的类被视为不同的类,因此具有自己的静态字段。

    public class SomeClass<T>
    {
        public static string SomeField;
    }
    

    然后:

    SomeClass<int>.SomeField = "A";
    SomeClass<string>.SomeField = "B";
    
    Console.WriteLine(SomeClass<int>.SomeField);    // A
    Console.WriteLine(SomeClass<string>.SomeField); // B
    

    例如,SomeClass&lt;int&gt; 将设置在库中,而 SomeClass&lt;string&gt; 将是您的副本。当然,这只有在您可以更改库或库已经使用泛型时才有效。

    【讨论】:

    • 这是我见过的最美丽、最可怕的泛型滥用之一。
    • @BradleyUffner 等到你在 C++ 中看到 CRTP 单例
    • 是的,但它们是不同的字段,而不是同一静态字段的两个实例。
    • @immibis:奇怪地重复出现的泛型模式在 C# 中也很方便。
    【解决方案3】:

    这两个建议都应该有效,但它们在架构方面都很棒。

    我不了解上下文,但在您的情况下,是否可以创建一个聚合类,该聚合类具有一个非静态的新属性并且只有两个实例。 这听起来对我来说是一个更好的方法。

    每当我有智能代码时,我的脑海中就会出现警报。对于开发人员来说,智能代码总是太聪明了。

    【讨论】:

    • 我完全清楚这样做的后果。我在问题的开头解释了这一点,但版主由于离题而删除了这部分。我有一个我无法更改的第 3 方库,它具有我需要两次的功能,但它是静态的,所以我只能使用它一次。我向图书馆的创建者询问了这个问题,他的回答是尝试使用黑客,因为重新设计太难了。拥有两个域的方法效果很好,而且看起来非常简单和合适(除了你必须管理生命周期),所以我很擅长。
    • 但是你是对的 - 重要的是要指出你不应该采用这种方法,除非你真的必须这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多