面试复习 二

1,反射的实现原理

可以在加载 程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息,反射即在运行期动态

获取类,对象,方法,对象数据等的一种重要手段

主要使用的类库:System.Reflection

核心类:

Assembly描述了程序集

Type描述了类这种类型

Constructorinfo描述了构造函数

Methodinfo描述了所有的方法

Fileidinfo描述了类的字段

Propertyinfo描述了类的属性

通过以上核心类可在运行时动态获取程序集中的类,并执行类构造产生类对象,动态获取对象的字段或属性值,更可以动态执行类方法和实例方法等.

2在类的构造函数前加上static会报什么错?为什么?

构造函数格式为:public+类名+static会报错因为静态构造函数不能有访问修饰符

原因:静态构造函数不允许访问修饰符,也不接受任何参数;无论创建多少类型的对象,静态构造函数只执行一次;运行库创建类实例或者首次访问静态成员之前,运行库调用静态构造函数;静态构造函数执行先于任何实例级别的构造函数;显然也就无法使用this和base来调用构造函数.

3,c#string类型比stringbuilder类型优势是什么

如果是处理字符串的话,用string中的方法每次都需要创建一个新的字符串对象并且分配新的内存地址,而stringbuilder是原来的内存里对字符创进行修改,所以字符串处理方面还是建议用stringbuilder这样比较节约内存,但是string类的方法和功能仍然还是比stringbuilder类要强.

string类由于具有不可变性(即对一个string对象进行任何更改时,其实都是创建另外一个string类的对象),所以当需要频繁的对一个string类进行更改的时候,建议使用stringbuilder类,

stringbuilder类的原理是首先在内存中开辟一定大小的内存空间,当对此stringBuilder类对象进行更改时,如果内存空间大小不够,会对此内存空间进行扩充,而不是重新创建一个对象,这样如果对一个字符串对象进行频繁操作的时候,不会造成过多的内存浪费,其实本质上并没有很大区别,都是用来存储和操作字符串的,唯一的区别就在于性能上.

string主要用于公共API,通用型好.用途广泛,读取性能高,占用内存小.stringbuilder主要用于拼接string,修改性能好.

不过现在的编译器已经把string的+操作优化成stringbuilder了,所以一般用string就可以了了

string是不可变的,所以天然线程同步

stringbuilder可变.非线程同步

17,数列1,1,2,3,5,8,13...第n位数是多少?用递归算法实现

pubilc int CountNumber(int num)
{
if (num==1||num==2)

return 1;

}else{

return CountNumber(num-1)+CountBumber(num-2);

}

 6,c#中有哪些常用的容器类,各有什么特点(https://blog.csdn.net/silangquan/article/details/51106968)

List ,HashTable , Dictionary , Stack , Queue

List:索引泛型容器,访问速度快,修改速度慢

HashTable/Dictionary:散列表格式,查询效率高,空间占用较大

Stack:后进后出      Queue:先进先出

数组Array:在C#中最早出现的。在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单。

ArrayList:对象的大小是按照其中存储的数据来动态扩充与收缩的

简单的说:
装箱:就是将值类型的数据打包到引用类型的实例中
比如将string类型的值abc赋给object对象obj

7, c#中常规容器和泛型容器的区别

不带泛型的容器需要装箱和拆箱操作,速度慢,所以泛型容器效率更高,数据类型更安全.

8, 有哪些常见的数值类

简单值类型--包括  整数类型, 实数类型 字符类型 布尔类型

复合值类型--包括  结构类型  枚举类型

9, c#中委托和接口的区别  各用在什么场合

接口(interface)是约束类应该具备的功能集合,约束了类应该具备的功能,使类从千变万化的具体逻辑中解脱出来,便于类的管理和扩展,同时又合理解决了类的单继承问题,

c#中的委托是约束方法集合的一个类,可以便捷的使用委托对这个方法集合进行操作.在以下情况中使用接口:

无法使用继承的场合(如果类被final修饰,那么此类不可以被继承。如果类中只有private的构造方法,那么此类不可以被继承。)

完全抽象的场合

多人协作的场合

10, c#中ref和out关键字区别

ref修饰参数,表示进行引用传递,out修饰参数也表示进行引用传递,单传递的引用只带回返回值,ref又进又出 out不进只出

11, for foreach Enumerator.MoveNext的使用,与内存消耗情况

for循环可以通过索引依次进行遍历,foreach和Enumerator.MoveNext通过迭代的方式进行遍历,内存消耗上本质上并没有太大的区别,但是在unity的update中,一般不推荐使用foreach因为会遗留内存垃圾(.迭代器是可以返回相同类型的值的有序序列的一段代码。)

12,当需要频繁创建使用某个对象时,有什么好的程序设计方案来节省内存

设计单例模式进行创建对象或者使用对象池

13, JIT和AOT的区别

Just-In-Time-实时编译: 执行慢  安装快  占用空间小一点

Ahead-Of-Time 预先编译: 执行快  安装慢  占内存占外存大

14 给定一个存放参数的数组, 重新排列数组

Void SortArray(Array arr){Array.Sort(arr)}

15, Foreachx循环迭代时,若把其中的某个元素删除,程序报错,怎么找到那个元素,以及具体怎么处理这种情况(Try......Catch捕捉异常,发送信息不可行)

foreach不能进行元素的删除,因为迭代器会锁定迭代的集合,解决方法:  记录找到索引或者key值,迭代结束后在进行删除

猜你喜欢

转载自blog.csdn.net/qq_41764460/article/details/81570443