Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的静态上下文总是单一的吗?_C#_.net - Fatal编程技术网

C#中的静态上下文总是单一的吗?

C#中的静态上下文总是单一的吗?,c#,.net,C#,.net,我有一个库,里面有一个静态字段。我想创建一个应用程序并引用这个库,这样我就有了这个静态字段的两个实例。Net运行时不允许两次引用同一个库,但我想知道是否有可能克服这个限制 我不允许更改库,但我可以复制/重命名它。这并不像你想象的那么疯狂。事实上,您可以通过使用来实现这一点 每个都有自己的静态变量存储位置。因此,您可以在流程中创建第二个AppDomain,并使用继承自中的MarshalByRefObject的对象在它们之间进行通信。而在AppDomains上工作时,您也可以使用泛型创建此效果,因为

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


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

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

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

而在AppDomains上工作时,您也可以使用泛型创建此效果,因为具有不同泛型类型参数的类被视为不同的类,因此它有自己的静态场

public class SomeClass<T>
{
    public static string SomeField;
}
公共类SomeClass
{
公共静态字符串字段;
}
然后:

SomeClass.SomeField=“A”;
SomeClass.SomeField=“B”;
Console.WriteLine(SomeClass.SomeField);//A.
Console.WriteLine(SomeClass.SomeField);//B

例如,
SomeClass
将在库中设置,而
SomeClass
将是您的副本。当然,这只有在您可以更改库或者库已经使用泛型的情况下才有效。

这两个建议都应该有效,但它们在体系结构方面都非常好

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


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

我喜欢你的答案,请你提供一些甜蜜的LoC:)@Jeremy我的答案中有一个完整的使用代理的跨应用程序域通信示例。这可能不疯狂,但它确实发出了一点“糟糕的体系结构警报”对我来说,这是我见过的最美丽、最可怕的泛型滥用之一。@BradleyUffner等到你在C++中看到CRTP单例,是的,但这些是不同的字段,不是同一静态字段的两个实例。@immibis:奇怪的循环泛型模式在C#中也非常方便。我完全意识到这一点的后果。我在问题的开头解释了这一点,但主持人由于话题无关而删除了这一部分。我有一个我无法更改的第三方库,它有两次我需要的功能,但它是静态的,所以我只能使用一次。我问过图书馆的创建者,他的回答是尝试使用黑客,因为重新设计太难了。拥有两个域的方法非常有效,而且看起来非常简单和合适(除了你必须管理生命周期),所以我对它很在行。但是你是对的——重要的是要指出,除非你真的必须这样做,否则你不应该使用这种方法
SomeClass<int>.SomeField = "A";
SomeClass<string>.SomeField = "B";

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