ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-基类中的静态字段生存时间

2019-12-02 01:07:06  阅读:314  来源: 互联网

标签:static field memory-management c net


我有单个静态字段的简单基类.我有许多从该基类派生的类.创建派生类时,它将导致对基类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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有