构造,析构,垃圾回收
构造函数
在实例化对象时会调用的用于初始化的函数,如果不写则默认存在一个无参构造函数
构造函数没有返回值,函数名和类名必须相同
构造函数可以重载
如果自己不是实现无参构造函数就实现了有参构造函数的话,就会失去默认的无参构造函数
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();
        }
    }
}
                    
                
                
            
        
浙公网安备 33010602011771号