c#基础八股
重载与重写:
重载是一个类里,方法名相同但参数列表不同,使用时根据参数列表决定使用哪个重载,目的是根据不同的传参实现不同的逻辑
重写:有virtual和abstract,virtual有默认实现,子类可重写也可以不重写。abstract必须是抽象类,不能有默认实现,只能有名字,传参列表和返回值,具体实现由子类决定,子类必须重写
重写的目的是实现多态,拓展父类的功能
委托:
委托是方法的容器,用于安全的存储,传递和调用方法,本质是一个类,存储 方法地址和调用目标对象
action是无返回值委托,func是有返回值委托
委托常用于事件机制和回调
事件是特殊的委托,封装了add和remove,禁止外部直接调用,只能用+=和-=
事件用于实现 发布-订阅模式
委托的陷阱:
1.内存泄漏,必须在销毁对象前取消订阅
2.匿名方法陷阱:用lambda表达式指向了this,this对应的对象会被保存,如果那个对象被销毁,但委托依然持有这个对象的引用,这个对象无法被gc回收,就会导致各种问题
3.空委托:可以用?.invoke调用委托
事件:
事件是一种成员,它让外部无法赋值,清空,调用委托,只能使用+=和-=订阅方法,主要用于实现观察者模式
使用方式:声明委托类型。声明event关键字。用+=订阅事件。在需要时调用事件,调用所有订阅的方法
值类型和引用类型:
值类型一旦赋值就无法更改,
把值类型的变量赋值给另外一个变量,会再开一块内存储存这个值
值类型变量再栈内存分配空间
值类型变量直接储存其数据值而不是引用
值类型的内存管理由c#自动处理
引用类型可以修改其属性和字段
引用类型的变量赋值给另一个变量,两个变量会指向同一个对象
引用类型再堆内存分配空间
引用类型的变量存储的是一个指针,指向这个对象
string和stringBuilder
string不可变,stringbuilder可变
因为都是引用类型,都是由c#的垃圾回收器管理
进行大量对字符串的操作时,stringbuilder因为可变,且有一个缓冲区,性能会更好,string性能不好的原因是不可变,每次操作都需要新建一个字符串
string的优点:简单,线程安全 stringbuilder优点:灵活,性能好
ref和out:ref是带着原值进入方法,修改的话外部也会修改
out只需要传参,不需要传参的值或数据,但是必须给他赋值,外部会拿到结果
static:声明static的方法或字段,属于类本身,所有实例共享
静态方法只能访问同样被static修饰的字段或方法
static的类,调用方法或访问字段,不需要实例化,也不能实例化
for与foreach:
for自己管理索引,退出条件,可以对集合或数组内的数据进行修改
foreach自动管理索引,默认退出条件是遍历完所有元素,适用于实现了IEnumerable的集合,不能修改集合中的值类型的元素(因为是只读的),引用类型可以改
更多推荐

所有评论(0)