c#面试题
1、简述 private、 protected、 public、 internal 修饰符的访问权限。
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 当前程序集内可以访问。
2.0、多态的理解
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。
我们来分别说明一下多态中涉及到的四个概念:重载,覆写,虚方法和抽象方法。
关于多态的理解https://www.cnblogs.com/liangshibo/p/12197106.html
2.1、实现多态的过程中overload 重载与override 重写的区别
overload 重载是方法的名称相同,参数或参数类型不同,进行多次重载以适应不同的需要。
Override 是进行基类中函数的重写,实现多态。
3、接口与抽象类的区别以及各自的使用场景
https://www.cnblogs.com/liangshibo/p/13394542.html
4、什么是装箱和拆箱?
装箱就是隐式的将一个值型转换为引用型对象。
拆箱就是将一个引用型对象转换成任意值型。
引用类型的值放在堆上,引用放在栈上,值类型的值放在栈上
5、堆和栈的区别
栈使用一级缓存,占用的空间比较小,内存自动释放,保存值和对象的引用,对象的引用就是指针
堆使用二级缓存,占用的空间比较大,内存需要程序员手动释放,如果程序员不手动释放,会由gc(垃圾处理器)自动释放,保存对象
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
6、什么是指针
指针是用来存储内存地址的变量,它指向单个对象的地址,除了void指针类型之外,指针的数据类型与所指向地址的变量数据类型须保持一致。不论指针指向的数据类型是哪一种,他本身永远是整型,保存的是地址。
7、什么是gc处理器
就是内存垃圾处理器,会自动释放内存,防止因内存泄露而引发的bug
对于托管资源通过GC自动清理回收。对于非托管资源,通过代码手动清除,在由GC回收。对于托管资源,存在“堆栈”和“托管堆”中,对于非托管的资源,一般就是Stream流,数据库的连接,网路连接等,需要我们手动释放。 用户代码可以用方法System.GC.Collect()来强制执行"垃圾回收器"
8、委托和事件
委托可以把一个方法作为参数代入另一个方法。
委托可以理解为指向一个函数的指针。
委托和事件没有可比性,因为委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能= 。加分的补充回答:事件内部就是一个private的委托和add、remove两个方法
https://blog.csdn.net/weixin_30401605/article/details/96594867
9、值类型和引用类型有哪些
值类型:整数,浮点数,高精度浮点数,布尔,字符,结构,枚举
引用类型:对象(Object),字符串,类,接口,委托,数组
除了值类型和引用类型,还有一种数据类型是空类型(null)gv
值类型不可为空,但是可空类型例外
10、string和stringBuild
不是说字符串是不可变的吗?string s="abc";s="123"不就是变了吗?
String是不可变的在这段代码中,s原先指向一个String对象,内容是 "abc",然后我们将s指向"123",那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"123",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String
如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类。两个类的工作原理不同:String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作实在是划不来。因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然,一般情况下觉察不到这二者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么StringBuilder类所耗费的时间和String类简直不是一个数量级的。
11、关于反射
https://www.cnblogs.com/liangshibo/p/13311222.html
12、关于注入依赖
https://www.cnblogs.com/liuqifeng/p/11077592.html
13、关于字典
https://www.cnblogs.com/arxive/p/5950628.html
14、关于元组
https://www.cnblogs.com/unity3ds/p/11641582.html
15、关于冒泡和递归
https://www.cnblogs.com/liangshibo/p/12207116.html
16.mvc和webapi
https://www.cnblogs.com/liangshibo/p/13412876.html
17.数据库面试题
https://www.cnblogs.com/liangshibo/p/13412911.html
18.C#中数组、ArrayList和List三者的区别
https://www.cnblogs.com/vaevvaev/p/7126568.html
19.c#中??的作用
?? 为 “null 合并运算符”,运算符左边值不为 null,则返回左边的值;否则返回右边值。
100、简单认识Nginx
https://blog.csdn.net/weixin_30401605/article/details/101692703

浙公网安备 33010602011771号