构造,析构,垃圾回收

构造函数

在实例化对象时会调用的用于初始化的函数,如果不写则默认存在一个无参构造函数

构造函数没有返回值,函数名和类名必须相同

构造函数可以重载

如果自己不是实现无参构造函数就实现了有参构造函数的话,就会失去默认的无参构造函数


class Person
{
    public string name;
    public int age;
    //类中允许自己申明无参构造函数,但是结构体中不允许
    public Person()
    {
        name="robot"
        age=1;
    }
    //构造函数可以重载
    public Person(int age)
    {
        //this代表当前调用该函数的对象本身
        this.age=age;
    }
        public Person(int age,string name)
    {
        this.age=age;
        this.name=name;
    }
}
Person p1 = new Person(10,"Machine");

构造函数的特殊写法

可以通过this重用构造函数代码

//想复用什么构造函数就在this()里面的填入相应类型的参数
public Person(int age,string name):this(i)
 {
    //会先调用public Person(int age)这个构造函数
    this.name=name;
 }

析构函数

基本语法

//析构函数是垃圾被回收的时候才会调用的函数
//~类名()
//{
//}
~Person()
{

}

垃圾回收机制

堆(Heap),栈(Stack)

遍历堆上动态分配的所有对象,来确认哪些对象是垃圾,垃圾就是没有被任何变量、对象引用的内容

垃圾回收有很多算法

Garbage Collecetion只负责堆内存的垃圾回收

引用类型都是存在堆中的,所以引用类型的分配和释放都通过垃圾回收机制来管理

而栈上的内存由系统自动管理

值类型在栈中分配内存,值类型有自己的生命周期,不用对它们进行管理

C#中内存回收机制的大概原理

小型的都会先储存在0代内存中,而在0代内存装满后就会触发0代内存的垃圾回收机制,把无法达到的内存释放,并把0代内存中的内容压缩搬迁到1代内存中,1代内存到2代内存也是如此,不过1代内存在触发垃圾回收机制的时候也回触发0代内存的垃圾回收机制。而且大对象总是被直接认为存进二代内存,目的是减少性能损耗,不会对大对象进行搬迁压缩,85000字节(83kb)以上的对象为大对象,0代和1代内存的存储速度比二代更快

手动触发GC

一般情况下不会频繁调用

一般都是在Loading读条的时候调用

GC.Collect();

习题

using System.Security.Cryptography.X509Certificates;

namespace 类和对象习题
{

    class Ticket
    {
        public uint distance;
        public float price;
        public Ticket(uint distance)
        {
            this.distance = distance;
            this.price = GetPrice(distance);
        }
        float GetPrice(uint distance)
        {
            float price;
            if (distance <=100)
            {
                return price=distance;
            }
            else if(distance > 100 && distance <= 200)
            {
                return price = distance * 0.95f;
            }
            else if (distance > 200 && distance <= 300)
            {
                return price = distance * 0.9f;
            }
            else
            {
                return price = distance * 0.8f;
            }
        }
        public void GetInfo()
        {
            Console.WriteLine("{0}公里的价格是{1}",distance,price);
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            Ticket ticket=new Ticket(301);
            ticket.GetInfo();
        }
    }
}
posted @   cannedmint  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示