恭喜你已经学习到了这里,到这篇笔记C#系列就要结束了。在这段时间里,你是否完全掌握了那些大大小小的知识点呢?C#系列专栏对于C#的知识点从入门到进阶都有所讲解,有些数据结构的知识点选了一些较为重要的,较常见的问题讲解了一些篇幅,有一些排序类的问题(你可能在现阶段使用的比较少,但是当你准备面试时却不可少的内容,面试可以会出的相关排序问题)我们将额外制定C#系列之排序问题相关的专栏额外讲解,因为那些不常用的知识点最容易忘记,你可以选择面试前再去学习,或者你想要对于C#了解更加通透,你可以去订阅相关专栏了解更多内容。
这篇笔记我们将认真梳理值类型与引用类型的相关知识点。关于值类型与引用类型我们之前有所讲述,今天我们将对于一些具体的问题去讲述值类型与引用类型。
目录
首先,我们要对于值类型与引用类型进行回顾。(你可以在心里默想相关知识点,或者翻阅C#系列值类型与引用类型了解基础知识)你需要了解的本质区别是:值的具体内容存在栈内存上,引用的具体内容存在堆内存上。
问题一:如何判断值类型与引用类型?
F12进到类型的内部去查看,如果是class类型就是引用,如果是struct类型就是值。
问题二:语句块
命名空间 | —— |
---|---|
上层语句块 | 类,接口,结构体 |
中层语句块 | 函数,属性,索引器,运算符重载等等(逻辑代码的位置) |
底层语句块 | 条件分支,循环等等(逻辑代码的位置) |
变量的声明:
上,中,底层都能声明变量。
上层:成员变量。
中、底层:临时变量。
问题三:变量的生命周期
编程时大部分是临时变量,在中底层声明的临时变量(函数,条件分支,循环语句块等等)。
当语句块执行结束时,没有记录的对象将被回收或者变成垃圾。
值类型:被系统自动回收。
引用类型:栈上用于存地址的房间被自动回收,堆中具体内容变成垃圾,待下次GC回收。(如果遗忘,可以回顾C#系列之垃圾回收机制)
如果你想要不被回收或者不变成垃圾,就必须将其记录下来。
如何记录呢?我们可以在更高层级记录或者使用静态全局变量记录。
问题四:结构体中的值和引用
结构体本身是值类型的前提是该结构体没有作为其他类的成员,在结构体中的值,栈中存储具体的内容。在结构体中的引用,在堆中存储引用具体内容。意思是引用类型始终存储在堆中。
问题五:类中的值和引用
类本身是引用类型,在类中的值和引用,都在堆中存储。
问题六:数组中的存储规则
数组本身是引用类型,值类型数组,堆中房间存具体内容,引用类型数组,堆中房间存地址。
问题七:结构体继承接口
利用里氏替换原则,用接口容器装结构体存在装箱拆箱。
interface ITest
{
int Value
{
get;
set;
}
}
struct TestStruct:ITest
{
int value;
public int Value
{
get
{
return value;
}
set
{
this.value=value;
}
}
}
//实现部分(此代码有所省略)
ITest iObj1=obj1;//装箱 value 1
ITest iObj2=iObj1;
iObj2.Value=99;
TestStruct obj3=(TestStruct)iObj1;//拆箱
到了这里C#系列正式完结,感谢小伙伴们的点赞与支持。希望我的笔记能够帮助到你。C#是学习Unity的基础,我们将继续学习游戏开发的相关内容,常见问题已经写至该专栏中,一些面试可能遇到的排序问题我们将在其它专栏內讲解,一直以来我的一些演示代码是有所省略的,都是大概给大家举个例子便于理解。感谢您的关注,同时恭喜您正式完成了C#系列的学习!(撒花撒花)