我有简单的基类和单个静态字段。我有很多来自这个基类的类。当我创建一个派生类时,它会导致调用基类static 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
(我可以通过调试器看到这一点,但它是否应该已经被前一行初始化了?)
答案 0 :(得分:2)
由于您已经更改了代码,我相信您需要了解.NET中的泛型如何工作。
泛型中的静态与正常情况下的行为略有不同。对于您提供的每个唯一开放类型T,基类维护唯一的静态成员值。
您可以通过Derived&lt;为相同的基类创建另一个开放类型 double 的实例。双&gt;然后你会看到我正在谈论的概念。
这里有一个示例代码,以便更清楚地说明:
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();
}
}
在这里你只能看到2个静态Ctor的调用。
答案 1 :(得分:1)
我意识到自己的错误!哇,基类实际上是一个模板类:Base<T>
。当我创建像new Derived<int>()
,new Derived<double>()
,new Derived<object>()
这样的基础对象时,这些是完全不同的类型,因此静态字段规则是不同的,我的理解是静态字段将是分配给T型家庭
我已经纠正了上面的例子以反映这一点(在最初的帖子中)。
答案 2 :(得分:0)
当您将泛型放入图片时,整个问题会发生变化。您对静态成员的继承的理解在没有泛型的情况下按预期工作,并且当泛型存在时,这个概念仍然有效,但泛型在运行时创建不同的类型。
Base<int>
和Derived1<int>
共享相同的静态成员,其中Derived1<decimal>
与运行时的Base<int>
不同,但不与静态成员共享。{/ p >