基类中的静态场寿命

时间:2011-12-22 02:20:39

标签: c# .net static memory-management field

我有简单的基类和单个静态字段。我有很多来自这个基类的类。当我创建一个派生类时,它会导致调用基类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

(我可以通过调试器看到这一点,但它是否应该已经被前一行初始化了?)

3 个答案:

答案 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 >