.NET 面试题

相换工作的朋友可以试着做一下:
1. CLR、CTS、CLS 分别是什么意思?
CLR:.net Framework的核心是运行库的执行环境,称为公共语言运行库(Common Language Runtime)或.net运行库。
CTS(Common Type System):通用类型系统。它定义了可以在中间语言中使用的预定义数据类型,所有用于.net Framework的语言都可以生成最终基于这些类型的编译代码。
CLS(Common Language Specification):CLS和CTS一起确保语言的互操作性。

2. 什么是基元类型?
由编译器直接支持的数据类型称为基元类型.
3. 值类型和引用类型的区别是什么?为什么要设计值类型?值类型会被GC回收吗?值类型是否能在托管堆分配?
 主要区别:对于值类型变量直接保存其数据,值类型存储在堆栈中;而对于引用类型变量仅保存地址,对应的数据可以在该地址中找到,引用类型存储在托管堆中;
  C#把基本类型规定为值类型,而把包含许多字段的较大类型规定为引用类型原因是为了得到最佳性能。如果要把自己的类型定义为值类型,可以把它声明为一个结构。

4. Equals、==、ReferenceEquals 如何区别使用?
ReferenceEquals方法总是用来判断两个对象的Identity的,不管是针对值类型还是引用类型。所以针对值类型,调用该方法总是会返回false,因为值类型作为这个方法的参数时会进行装箱操作。
实例Equals方法也是用来区分两个对象的Equality的。
==运算符是可由类重载的运算符,它也是用来判断恒等的。
对于未重载==的引用类型,会比较两个引用类型是否引用同一个对象。这跟引用类型的Equals()方法是一样的。

对于未重载==的值类型,该运算符会比较这两个值是否"按位"相等,即是否这两个值中的每个字段都相等。和Equals方法一样,推荐在自定义值类型中,也要重载==运算符,因为也存在反射在效率上的影响。

==运算符和Equals方法的区别在于多态表现上。Equals方法是重写,而==运算符是被重载。这意味着除非编译器知道调用具体的重载版本,否则它只是调用未重载的==版本。

5. 什么是虚方法?如何理解多态?
当类中的方法声明前加上了virtual   修饰符,我们称之为虚方法,反之为非虚。使用了virtual   修饰符后,不允许再有static,   abstract,   或override   修饰符。  

多态这东西我理解的不太好 在网上找了这么一段(继承的目的是复用,继承复用包括两方面的复用:抽象(接口)复用,实现(过程)复用。

多态的目的就是要将抽象复用及实现复用剥离开来,子类虽然拥有和父类一样的抽象接口,但实现过程却未必一样,多态的引入就是要在继承的基础上实现变异的可能性。当然子类继承也不一定会产生实现差异,所以多态允许在产生差异的时候override父类接口,没有产生差异的时候直接继承。

interface则是另一种复用方式,interface只允许抽象复用,而禁止实现复用,所以interface比继承显得更轻量,但实际上系统中的实现复用必须由其他机制来保证。)

6. overload 和 override 有什么区别?
重载Overload特点(两必须、一可以)
public bool withdraw(double amt, string name)
public double withdraw(double amt)
1、方法名必须相同
2、参数列表必须不相同
3、返回值类型可以不相同
注意:override存在于继继承的关系类中。
覆写Override特点(三相同)
public override bool withdraw(...)
1、方法名相同
2、参数列表相同
3、返回值类型相同
注意:存在于同一类中,但是只有虚方法和抽象方法才能被覆写.
7. 基于接口编程的目的是什么?什么情况下使用接口,什么情况下使用抽象类?
8. 委托是什么意思?什么叫委托链?我们能在代码中继承 MulticastDelegate吗?
9. 实现 Iterators 一般用到哪些接口?
10. 请写一个简单泛型类型,要求有两个泛型参数 T、K,其中 T 必须是值类型,K 必须实现了 IDisposable 接口。
原文地址:https://www.cnblogs.com/abeen/p/641485.html