Unity C#知识点记录
C#值类型和引用类型
值类型的变量直接存储数据,值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。
引用类型的变量持有的是数据的引用,数据存储在数据堆中。
值类型直接存储其值,而引用类型存储对其值的引用
拆箱和装箱
装箱:将值类型(如 int ,或自定义的值类型等)转换成 object 或者接口类型的一个过程
装箱是隐式的;拆箱必定是显式的。
代码表示:
int i = 123; // 值类型 object o = i; // 装箱 int j = (int)o; // 拆箱
重载和重写的区别?
1:所处的位置不 同 重载在同类中 ;重写在父子类中;
2:定义方式不同
重载方法名相同,参数列表(参数个数,参数类型)不同;
重写方法名和参数列表都相同,父类中使用virtual关键字来把某个方法定义为虚方法,子类中使用Override关键字重写父类的虚方法;
3:调用方式不同 重载使用相同对象以不同参数调用;重写用不同对象以相同的参数调用;
4:多态时机不同 重载是编译时多态;重写是运行时多态;
String和StringBuilder的区别
1: String是不可变类,StringBuilder是可变类。
2: StringBuilder继承自AbstractStringBuilder这个类,而AbstractStringBuilder和String都继承自Object这个类(Object是所有java类的超类)。
3: string本身是不可改变的,它只能赋值一次,每一次内容发生改变,都会生成一个新的对象,然后原有的对象引用新的对象,而每一次生成新对象都会对系统性能产生影响,这会降低.NET编译器的工作效率。
4: StringBuilder类则不同,每次操作都是对自身对象进行操作,而不是生成新的对象,其所占空间会随着内容的增加而扩充,这样,在做大量的修改操作时,不会因生成大量匿名对象而影响系统性能。
总结一下
1、string继承object类,stringbuilder继承AbstractStringBuilder。
2、string是不可变类,stringbuilder是可变类。
3、stringstringbuilder运行速度比string快。
C#和C++相比结构体的独有用法
结构可带有方法、字段、索引、属性、运算符方法和事件。
结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义默认的构造函数。默认的构造函数是自动定义的,且不能被改变。
结构可实现一个或多个接口。
结构成员不能指定为 abstract、virtual 或 protected。
当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。
const readonly 与sealed
- const和readonly都是只读的。
- 对于const,其修饰的常量类型为静态常量;
对于readonly,其修饰的常量类型为动态常量。 - const高效,readonly灵活。
- 实际使用中,常常用static readonly来代替const,以此来平衡const在灵活性上的不足。
sealed,即密封类和密封方法。
在方法中使用sealed,只能是在已经被重写的方法中定义sealed,表示这个方法不可以再被重写。
委托,delate:三种泛型委托
Predicate <T> Action<T> Func
1.在这些方法中存在一个Predicate <T> 表达式,它是一个返回bool的泛型委托,能接受一个任意类型的对象作为参数。
2.Action<T> 的使用方式与 Predicate<T> 相似,不同之处在于 Predicate<T> 返回值为 bool , Action<T> 的返回值为 void。
3.委托 Func 与 Action 相似,同样支持 0~16 个参数,不同之处在于Func 必须具有返回值
协程与线程的区别
一个线程可以多个协程,一个进程也可以单独拥有多个协程。
线程进程都是同步机制,而协程则是异步。
线程是协程的资源。协程通过Interceptor来间接使用线程这个资源。
结构和类的区别
结构是值类型,它在栈中分配空间
类是引用类型,它在堆中分配空间,栈中保存的只是引用
Struct变量使用完之后就自动解除内存分配,Class实例有垃圾回收机制来保证内存的回收处理。
结构体中声明的字段无法赋予初值,类可以
结构体的构造函数中,必须为结构体所有字段赋值,类的构造函数无此限制
三种实现计时器的方法
1. System.Windows.Forms命名空间下的Timer控件
MyTimer.Enabled = true; //启动计时器
MyTimer.Interval = 1000; //设置计时器时间间隔,单位为ms
MyTimer.Stop(); //停止计时
MyTimer.Start(); //重新计时
2. system.Timers命名空间下的Timer类,使用Elapsed事件另开一个线程。
3. System.Threading.Timer类。定义Timer类时,通过构造函数进行初始化。
unity 生命周期
Awake-----OnEnable-----Start-----FixedUpdate------Update-------LateUpdate-----OnDisable-------OnDestroy--------OnApplicationQuit
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器