虚函数,是指被virtual关键字修饰的成员函数。
在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数列表){函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。
每个虚函数都会有一个与之对应的虚函数表,该虚函数表的实质是一个指针数组,存放的是每一个对象的虚函数入口地址。对于一个派生类来说,他会继承基类的虚函数表同时增加自己的虚函数入口地址,如果派生类重写了基类的虚函数的话,那么继承过来的虚函数入口地址将被派生类的重写虚函数入口地址代替。在程序运行时会发生动态绑定,将父类指针绑定到实例化的对象实现多态。
自增运算符意义不同。
引用比指针使用起来形式上更漂亮,使用引用指向的内容时可以之间用引用变量名,而不像指针一样要使用*;定义引用的时候也不用像指针一样使用&取址。引用比指针更安全。由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为NULL,所以不安全。const指针虽然不能改变指向,但仍然存在空指针,并且有可能产生野指针(即多个指针指向一块内存,free掉一个指针之后,别的指针就成了野指针)。
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。
插入性能: LinkedList > Dictionary > HashTable > List
遍历性能:List > LinkedList > Dictionary > HashTable
删除性能: Dictionary > LinkedList > HashTable > List
不带泛型的容器需要装箱和拆箱,操作速度慢,所以泛型容器效率更高,数据类型更安全。
多个代码对 【不同数据类型】 执行 【相同指令】的情况
泛型:多个类型共享一组代码
泛型允许类型参数化,泛型类型是类型的模板
5种泛型:类、结构、接口、委托、方法
类型占位符 T 来表示泛型
泛型类不是实际的类,而是类的模板
从泛型类型创建实例
声明泛型类型→通过提供【真实类型】创建构造函数类型→从构造类型创建实例
类
非托管代码才需要这个关键字一般用在带指针操作的场合。
项目背包系统的任务装备栏使用到。
默认情况下,C#是不支持 指针 的,unsafe 关键词用于在C#表示不安全的上下文,如果想要在C#中进行任何和指针相关的操作,就必须配合unsafe关键词使用。
在公共语言运行时(CLR)中,不安全代码是指无法验证的代码。
C# 中的不安全代码不一定是危险的,只是 CLR 无法验证该代码的安全性。因此,CLR 将仅执行完全信任的程序集中的不安全代码。
如果使用不安全代码,应该负责确保代码不会引发安全风险或指针错误
如果想要在Unity中正常使用C#中的unsafe关键词进行程序编写,我们必须在Unity的 Player Settings 中的 Other Settings 中将 Allow 'unsafe' Code 选项勾选上
unsafe关键词的基本用法:
总结:unsafe 的使用虽然能让我们在C#中使用指针,但是会存在安全风险和稳定性风险,如果没有特殊需求,请尽量避免在C#中使用 unsafe。
ref修饰引用参数。参数必须赋值,在内部可改可不改,带回返回值,又进又出
out修饰输出参数。参数可以不赋值,在内部必须修改该值,带回返回值之前必须明确赋值。
引用参数和输出参数不会创建新的存储位置
如果ref参数是值类型,原先的值类型数据,会随着方法里的数据改变而改变,
如果ref参数值引用类型,方法里重新赋值后,原对象堆中数据会改变,如果对引用类型再次创建新对象并赋值给ref参数,引用地址会重新指向新对象堆数据。方法结束后形参和新对象都会消失。实参还是指向原始对象,值不够数据改变了
请看:把 ref 和 out 关键字说透_out关键字的作用-CSDN博客
感谢大佬!