编程语言
首页 > 编程语言> > c#-基类中的静态字段生存时间

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