我正在编写一些连接到模拟服务的ashx处理程序,我希望它们共享模拟服务实例。我最简单的方法是创建一个静态实例
public class AbstractHandler
{
static IService _impl;
public static IService Impl
{
get
{
if (_impl == null)
{
_impl = new MockService();
}
return _impl;
}
}
}
然而,我想知道这是否会起作用;从这个类继承的不同处理程序是否会有自己的静态_impl引用或者它们将被共享?
答案 0 :(得分:6)
静态字段只存在一次,除非是泛型类型,在这种情况下,对于每个使用的泛型参数组合,它都存在一次。
即使该类是基类,可能是抽象的,也适用相同的规则。请注意,如果声明字段的类不是通用的,则该字段将存在一次,即使后代是通用的。关于“每个组合一次......”的规则只有在声明静态字段的类是通用的时才会发挥作用。
所以,如果你的问题是:
如何使静态字段成为每个后代而不仅仅是
然后答案就是你应该使你的基类通用,并将后代类型作为泛型参数传递。
示例LINQPad脚本,用于演示“每个通用参数组合一次”:
void Main()
{
var i = new Test<int>();
var s = new Test<string>();
Test<bool>.UsageCount.Dump();
Test<int>.UsageCount.Dump();
Test<string>.UsageCount.Dump();
}
public class Test<T>
{
public static int UsageCount;
public Test()
{
UsageCount++;
}
}
输出:
0 1 1
使用基类演示的示例:
void Main()
{
var i = new Test1();
var s = new Test2();
Test1.UsageCount.Dump();
Test2.UsageCount.Dump();
Test3.UsageCount.Dump();
}
public abstract class Base<T>
{
public static int UsageCount;
protected Base()
{
UsageCount++;
}
}
public class Test1 : Base<Test1>
{
}
public class Test2 : Base<Test2>
{
}
public class Test3 : Base<Test3>
{
}
输出:
1 1 0