C#对象的生命周期

主要是对对象生命周期的相关细节的一些认识,在这里为了测试而创建一个非常大的对象数组(精确是50 000)。
首先我们需要创建Car实体类进行测试用的

 class Cars
    {
        // Car的“状态”
        public string petName;
        public int currSpeed;

        // 自定义的默认构造函数
        public Cars()
        {
            petName = "Chuck";
            currSpeed = 10;
        }

        // 在这里,currSpeed会获取int的默认值0
        public Cars(string pn)
        {
            petName = pn;
        }

        // 让调用者设置Car的完整“状态”
        public Cars(string pn, int cs)
        {
            petName = pn;
            currSpeed = cs;
        }

        // Car的功能
        public void PrintState()
        {
            Console.WriteLine("{0} is going {1} MPH.", petName, currSpeed);
        }

        public void SpeedUp(int delta)
        {
            currSpeed += delta;
        }
    }

然后在控制台Main()函数中写了一个demo用来作为垃圾回收的显示请求(通过GC.Collect()方法)。

static void Main(string[] args)
        {
            Console.WriteLine("**** Fun with System.GC ****");

            // 输出堆上估计的字节数
            Console.WriteLine("Estimated bytes on heap: {0}",
                GC.GetTotalMemory(false));

            // MaxGeneration是从0开始的
            Console.WriteLine("This OS has {0} object generations.\n",
            (GC.MaxGeneration + 1));
            Car refToMyCar = new Car("Zippy", 100);
            Console.WriteLine(refToMyCar.ToString());

            // 输出refToMyCar对象的代
            Console.WriteLine("\nGeneration of refToMyCar is: {0}",
                GC.GetGeneration(refToMyCar));

            // 为测试目的创建对象数组
            object[] tonsOfObjects = new object[50000];
            for (int i = 0; i < 50000; i++)
                tonsOfObjects[i] = new object();

            // 仅回收第0代对象
            GC.Collect(0, GCCollectionMode.Forced);
            GC.WaitForPendingFinalizers();

            // 输出refToMyCar对象的代
            Console.WriteLine("Generation of refToMyCar is: {0}",
                GC.GetGeneration(refToMyCar));

            // 看一下tonsOfObjects[9000]是否还活着
            if (tonsOfObjects[9000] != null)
            {
                Console.WriteLine("Generation of tonsOfObjects[9000] is: {0}",
                    GC.GetGeneration(tonsOfObjects[9000]));
            }
            else {
                Console.WriteLine("tonsOfObjects[9000] is no longer alive.");
            }

            // 输出一个代被清除的次数
            Console.WriteLine("\nGen 0 has been swept {0} times",
                GC.CollectionCount(0));
            Console.WriteLine("Gen 1 has been swept {0} times",
                GC.CollectionCount(1));
            Console.WriteLine("Gen 2 has been swept {0} times",
                GC.CollectionCount(2));
            Console.ReadLine();
        }

控制台启动运行,我们看下输出如下的结果
在这里插入图片描述
由此可以看到,即使这个Main()方法只做了一次垃圾回收的显示请求,但是CLR在幕后也执行了多次垃圾回收。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值