目录
一、类和结构的区别:
二、栈和堆的区别:
1.官方解读:
栈:
是编译期间就分配好的内存空间,因此代码中必须就栈的大小有明确的定义;
局部值类型变量、值类型参数等都在栈的内存中。
堆:
是程序运行期间动态的分配空间,可以根据程序的运行情况确定分配堆的内存大小。
2.自己理解(栈和堆举例区别):
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
如何记住呢?
上边拿吃饭举例了,栈就像是餐馆,堆就像是在家,我们去吃的都是涮羊肉。
1.栈的谐音就是沾(沾一沾吃完就走了)。
2.堆如何联想(自己准备材料,要把刷的东西都堆在一起,吃完饭碗啥的要堆起来去刷)。
三、值类型和引用类型:
值类型 | 引用类型 |
1.变量储存真正的数据 | 1.储存再内存中的起始地址 |
2.数据储存再栈上面 | 2.数据储存在堆上面 |
3.Sytem.ValueType | 3.Sytem.Object |
4.不能用Null释放 | 4.能用Null释放 |
5.超过变量作用范围自动释放 | 5.有.net框架的垃圾回收器自动回收 |
6.占用内存少(数据直接存栈里) | 6.占用内存多(现在栈申请地址,在存堆里) |
7.执行速度快 | 7.执行速度慢 |
1.net中那些事值类型,那些是引用类型?
四、里氏替换
1.官方解读
里氏替换就是子类可以替换父类,并且出现在父类能够出现的任何地方。
反过来,父类对象是不能替换子类,需要强行转换才可以。
2.自己理解:
父类new父类的空间,父类要转换成子类,父类没有子类的内容,而子类继承了父类的一切内容,子类所需的空间要比父类多,所以父类转换不了子类,而子类的空间大,子类空间里包含了父类所需的内容,所以子类可以转父类,有一些空间是没有用到。
举例:
父类有一个属性和一个方法,假如占两个空间,子类自己也有一个属性和一个方法,但是子类由于继承了父类,子类相当于拥有2个属性和2个方法,所以子类的空间会有4个,父类类型的2个加上自己的2个,所以子类可以转换成父类,而父类不能转换成子类。
3.类型转换可以分为as和is两种:
is返回的是bool值,true是能转换,false是不能转换。
as 如果转换不了不报异常,返回的值为null。
4.is和as
//如果成功了就是成功,不成功返回为空
typeA is typeB //仅判断
typeA as typeB //先判断,再转换