c#基础 疑难杂症(持续更新中)
前言:
身处IT行业,最尴尬的情况莫过于面试或者考试的时候答不上来,以下是平日里遇到的一些常见的问题,记录一下!
一、什么是值类型?什么是引用类型?拆箱?装箱?装箱三步曲?
答:值类型:基元类型(int、float等)、枚举、结构,值存放在栈中,顺序存储
引用类型:string、数组、object、类对象等,值存放在堆中,引用对象也占一块内存,指向值的地址
拆箱:把引用类型转换成值类型
装箱:对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。
( 1 )第一步:新分配托管堆内存 ( 大小为值类型实例大小加上一个方法表指针。
( 2 )第二步:将值类型的实例字段拷贝到新分配的内存中。
( 3 )第三步:返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用了
二、数组跟列表有什么区别?
答:数组:长度固定,类型统一,可为空
列表:长度可变(初始为10),类型可变,不可为空
三、哈希表跟字典的区别?
答:哈希表:不用拆装箱、线程不安全
字典:需要拆装箱,线程安全
四、ref跟out有何不同?
答:ref :参数需要初始化才能被函数使用,在方法内方法外都可以使用
out:无需初始化,只能在方法外调用
用处:用来将方法内对形参赋值后的结果传递出来
五、虚函数重写跟覆盖?重载又是什么?
答:重写:子类可以调用自己的方法
覆盖:子类的方法被父类覆盖,子类调用该方法实际上还是调用子类的方法
重载:多个方法共用一个方法名,方法之间参数类型跟数量不同
六、堆跟栈有什么区别?
答:堆:无序的,他是一片不连续的内存域,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC) 来回收
栈:先进后出,他是一片连续的内存域,有系统自动分配和维护
七、类成员加上static修饰符有什么作用?
答:静态成员:在定义的时候就已经占用了空间,而且只占据一块内存,当某个地方改变是,全局可见,属于类成员
非静态成员:在类的对象实例化时创建,创建多少个对象,就开辟了多少空间来存放自己的非静态成员,属于对象成员
八、垃圾回收机制(GC)?托管跟非托管资源?
答:垃圾回收机制主要是针对堆。值类型在使用完后会自动释放,但是引用类型不会,所以需要靠GC来管理托管堆内存。
处于堆里的内存即是托管资源
九、partial修饰符有什么作用?
答:Partial是分部类型的意思。允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中
如果一个类型有一个部分使用了abstract修饰符,那么整个类都将被视为抽象类
十、委托?事件?
答:委托:专业一点来说,委托的作用就是为了代码的可扩展性,将方法当做参数动态传递
事件:一种特殊的委托,相当于对委托做了封装处理(仅对注册方法开放)
十一、const跟readonly有什么区别
答:
1) 、初始化位置不同。 const 必须在声明的同时赋值; readonly 即可以在声明处赋值,也可以在构造函数中赋值 ;
2 )、修饰对象不同。 const 即可以修饰类的字段,也可以修饰局部变量; readonly 只能修饰类的字段
3 )、 const 是编译时常量,在编译时确定该值; readonly 是运行时常量,在运行时确定该值。
4 )、 const 默认是静态的;而 readonly 如果设置成静态需要显示声明
5 )、修饰引用类型时不同, const 只能修饰 string 或值为 null 的其他引用类型; readonly 可以是任何类型。
十二、基元类型的有符号数跟无符号数的区别?
答:有符号数的最高位是符号位,0则表示正数,1则表示负数。
举个例子:byte类型的 86H,二进制为:1000 0100 ,十进为:byte则表示 2^7+4= 132,sbyte则表示 - 2^7+4= -124.
因此,表示范围是一样,字节长度也是一样的,但是无符号没有负数,所以是两倍。
十三、for跟foreach有什么区别?
答:for:通过索引器遍历、循环体内值可变。
foreach:通过迭代器遍历、循环体内值不可变、语法更简单、效率更高。
注意:不是任何场景都要用foreach,因为foreach不支持在内部改变集合的值
十四、特性能不能被继承?
答:可以,特性中的属性也属于类的一部分,理所应当会被继承
十五、string类型为什么是引用类型?
string str = "aaa"; string str1 = str; str = "bbb";
// 输出为
str=“bbb”;
str1 = “aaa”;
答:经过以上代码测试,很容易看出string具有值类型的特征,str的值改变了,但是str1还是指向原来的地址,但是

浙公网安备 33010602011771号