构造函数
在实例化对象时会调用的用于初始化的函数,如果不写则默认存在一个无参构造函数
构造函数没有返回值,函数名和类名必须相同
构造函数可以重载
如果自己不是实现无参构造函数就实现了有参构造函数的话,就会失去默认的无参构造函数
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(){this.age=age;this.name=name;}
析构函数
基本语法
//析构函数是垃圾被回收的时候才会调用的函数
//~类名()
//{
//}
~Person()
{}
垃圾回收机制
堆(Heap),栈(Stack)
遍历堆上动态分配的所有对象,来确认哪些对象是垃圾,垃圾就是没有被任何变量、对象引用的内容
垃圾回收有很多算法
Garbage Collecetion只负责堆内存的垃圾回收
引用类型都是存在堆中的,所以引用类型的分配和释放都通过垃圾回收机制来管理
而栈上的内存由系统自动管理
值类型在栈中分配内存,值类型有自己的生命周期,不用对它们进行管理
C#中内存回收机制的大概原理
小型的都会先储存在0代内存中,而在O代内存装满后就会触发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();}}
}