c#-基类中的静态字段生存时间
作者:互联网
我有单个静态字段的简单基类.我有许多从该基类派生的类.创建派生类时,它将导致对基类static ctor的调用,该ctor初始化静态字段(按预期方式工作).问题是当我创建另一个派生类时,该派生类继承自同一基数,基数中的静态字段仍为null,为什么?它是由我实例化的第一类初始化的.
基类中的静态字段不应该具有全局分配并且对所有派生类可见(即共享)吗?
我的模特:
class Base<T>
{
protected static object s_field = null;
static Base { s_field = new object(); }
}
class Derived1<T> : Base<T>
{
}
class Derived2<T> : Base<T>
{
}
// ... later in the program
Derived1<int> instance1 = new Derived1<int>(); // initializes static field (s_field in base class) for all derived types
Derived2<double> instance2 = new Derived2<double>(); // the static field is null
(我可以通过调试器看到它,但是是否应该尚未通过上一行对其进行初始化?)
解决方法:
既然您更改了代码,我相信您需要了解泛型在.NET中的工作方式.
泛型中的静态行为与正常情况下有些不同.对于您提供的每个唯一的开放类型T,基类都维护唯一的静态成员值.
您可以通过Derived<为相同的基类创建另一个open double类型的实例.双重>然后您会看到我在说的概念.
这里有一个示例代码可以更清楚地演示:
public class Base<T>
{
public static string str = null;
static Base()
{
str = "hello";
Console.WriteLine("Ctor cald");
}
}
public class Derived1<T> : Base<T>{}
public class Derived2<T> : Base<T> { }
public partial class Program
{
public static void Main()
{
Derived1<int> derv = new Derived1<int>();
Derived2<double> derv2 = new Derived2<double>();
Derived2<double> derv3 = new Derived2<double>();
Console.ReadKey();
}
}
在这里,您将仅看到静态Ctor的2个调用.
标签:static,field,memory-management,c,net 来源: https://codeday.me/bug/20191202/2084655.html