【发布时间】:2011-12-22 02:20:39
【问题描述】:
我有一个带有单个静态字段的简单基类。我有许多从这个基类派生的类。当我创建派生类时,它会调用基类静态 ctor 来初始化静态字段(按预期工作)。问题是当我创建另一个继承自同一个基的派生类时,基中的静态字段仍然为空,为什么????它是由我实例化的第一个类初始化的。
基类中的静态字段不应该具有全局分配并且对所有派生类可见(即共享)吗?
我的模特:
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
(我可以通过调试器看到这一点,但它应该不是已经被上一行初始化了吗??)
【问题讨论】:
-
请不要在标题前加上“C# .net -”。这就是标签的用途。
-
@ActiveX 这是您的程序可以执行的唯一行吗?是否有可能在
instance1的实例化之间的某个地方将静态字段设置为空,此时instance2对象似乎具有空值?这可以通过同时比较两个对象来验证,如果一个为空而另一个不是,那么你已经遗漏了一些东西。 -
应该而且确实如此。我刚刚尝试了您的 sn-p 并且静态字段不为空。因此,无论您在观察什么,其原因都不在此处发布的代码中
-
这里还有更多内容,因为这些类型被 Caslte Active Record 库使用,但我认为它不会在初始化期间使我的静态字段无效。让我尝试在框架之外创建我的对象。我会尽快报告。
-
我意识到我的错误了!哇,基类实际上是一个模板类:Base
。当我创建像这样 new Derived (), new Derived (), new Derived
标签: c# .net static memory-management field