C#学习笔记(十一)

时间:2024-10-25 14:43:40

C#学习笔记(十一)

    • 第八章 垃圾回收机制GC与类的静态方法
      • 一、垃圾回收机制GC
        • 1. 对象如何被销毁的
      • 二、类的静态方法
        • 1. 静态方法的使用
        • 2. 为什么会报错
          • 2.1 静态方法定义中的报错
          • 2.2 方法使用中的报错
        • 3. 什么情况下用静态

第八章 垃圾回收机制GC与类的静态方法

一、垃圾回收机制GC

在面向对象编程中,我们需要对象就构造一个对象,对象会越创建越多,但是不断增多的同时,不再被使用的对象,也不会不断的被销毁,也就是对象是有生命周期的,只要正确的使用对象,不会因为操作创建对象,而让内存爆满的。实际中,比如大量的使用了后面我们讲的静态类等等不合理的程序设计才会使内存爆满。

1. 对象如何被销毁的

对象被销毁之前,必须是确保不再被使用的。具体如何判断还得是由**.NET** 专门的垃圾回收机制 GC 来决定,我们不用关心。
GC(Garbage Collection)垃圾回收机制,是.NET 运行时内置的一个专门用来监控和销毁对象的组件。创建完对象后,对象的使用情况被 GC 监控,必要的时候就会销毁,所谓销毁就是把它从内存中删除掉。保证内存合理的空间。
做**.NET 开发最大的好处**就是不用特别关心对象是如何销毁的,而只是尽管使用即可。

二、类的静态方法

前面讲,对象不用的时候可以被销毁,但是在一些特性情况下,如果我们使用对象非常频繁,我们也知道对象创建过程不仅占用内存,而且也是需要时间的,这样的话对于对象使用频率非常高的情况,高频率去创建对象可能在性能上有损失。
为了解决这个问题,.NET 中提供了静态类、静态方法、静态字段等概念。实际使用中在类型之前加上static即可。

1. 静态方法的使用

依旧是在类中添加一个方法

        public void printf3(string number ,bool live = true)
        {
            Console.WriteLine(number + ".weighe:" + Weight + "\n" + number + ".name:" + Name);
            if(!live)
            {
                Console.WriteLine("is die");
            }
        }
        public static void printf4(string number, bool live = true)
        {
            Console.WriteLine(number + ".weighe:" + Weight + "\n" + number + ".name:" + Name);
            if (!live)
            {
                Console.WriteLine("is die");
            }
        }

其中printf3();,在之前使用过,是一个实例方法。定义一个和printf3();内容相同的静态方法printf4();,会产生报错,如图所示
在这里插入图片描述
在Main中直接调用上述方法,也会产生报错如图所示:
在这里插入图片描述
下面从初始化和内存的角度分析报错原因

2. 为什么会报错
2.1 静态方法定义中的报错
        public double Weight
        {
            get;
            set;
        }
        public string Name
        {
            get;
            set;
        }
        public void printf3(string number ,bool live = true)
        {
            Console.WriteLine(number + ".weighe:" + Weight + "\n" + number + ".name:" + Name);
            if(!live)
            {
                Console.WriteLine("is die");
            }
        }
        public static void printf4(string number, bool live = true)
        {
            Console.WriteLine(number + ".weighe:" + Weight + "\n" + number + ".name:" + Name);
            if (!live)
            {
                Console.WriteLine("is die");
            }
        }

其中Weight 和Name是类中的两个属性,但是都是非静态的。
在这里插入图片描述
首先静态的东西,他的初始化是由 CLR 完成的,也就是不需要我们去初始化。也就是我们什么都不需要做,内存中自动就为其开辟空间创建了实体。也就是静态方法中只能使用已经存在的东西。在初始化静态方法printf4();时它所使用的 Weight和Name并没有被开辟空间。所以不可以使用。

2.2 方法使用中的报错

在这里插入图片描述
这里printf3();产生了报错,是因为它是一个class中的实例方法,程序不会将它自动初始化,而且从始至终在Main中并没有给它开辟空间,所以内存中并没有printf3();的位置那么如何给它开辟空间呢,只能通过创建对象的方式实现。

3. 什么情况下用静态

首先我认为静态的东西持续占用了内存势必会有它的好处,可以提升运行速度,当原有的软件执行效率不高时,可以通过将使用频繁的对象设置为静态的从而提升效率。
开发中,我们不能随便的去使用静态的成员,除非必要。
静态类,同样没有必要,不要用静态类,如果一个类定义成静态的,则里面所有的成员必须都是静态的。当然如果里面的成员都是静态的,或者部分静态,这个类可以不是静态的。