C#.NET面试题汇总系列三:高级知识
0. 参考文档
1. IList 接口与List的区别是什么?
IList 泛型接口是 ICollection 泛型接口的子代,并且是所有泛型列表的基接口,接口定义了一些操作方法这些方法要自己去实现
List 是个类型 已经实现了IList 定义的方法
2. 谈谈ArrayList和List<>的性能区别
ArrayList的每一个Add方法,都需要将数据进行装箱操作,而如果提取的值是值类型又会涉及拆箱动作,而装箱和拆箱是有损性能的,是会耗时的
3. 泛型的主要约束和次要约束是什么?
主要约束:一个泛型参数至多拥有一个主要约束,主要约束可以是一个引用类型、class或者struct
次要约束:主要是指实参实现的接口的限定。对于一个泛型,可以有0到无限的次要约束,次要约束规定了实参必须实现所有的次要约束中规定的接口
4. 如何把一个array复制到arrayist里?
foreach(object arr in array)
{
arrayist.Add(arr);
}
5. 有10万个数字,判断一下里面是否存在重复的数字
使用C#的List集合自带的去重方法,例如 Distinct(),GroupBy()等
利用 Dictionary 的Key值唯一的特性
6. 什么是闭包?
通过 Lambda 表达式可以访问 Lambda 表达式块外部的变量,这成为闭包
当引用外部变量时,需要注意,外部变量变化时,lambda表达式的结果也可能会随着外部变量变化而变化
7. EF(Entity Framework)是什么?
体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架
8. 什么是ORM?
ORM指的是面向对象的对象模型和关系型数据库的数据结构之间的互相转换
9. 描述EF的几种开发模式
答: 共三种,但是CodeFirst有一种特殊的
- CodeFirstFromDB,代码先行,但是实体来时来自于数据库
- CodeFirst 领域设计时先定义实体类,用实体类生成数据库
- DbFirst 从数据库生成实体类
- Model First 使用Visual Studio实体设计器,设计ER,同时生成Entity类DB
10. 请说明EF中映射实体对象的几种状态
一共五种状态
-
Detached:该实体未由上下文跟踪
-
Unchanged:实体将由上下文跟踪并存在于数据库中,其属性值与数据库中的值相同
-
Added:实体将由上下文跟踪,但是在数据库中还不存在
-
Deleted:实体将由上下文跟踪并存在于数据库中,但已标记为在下次调用 SaveChanges 时从数据库中删除
-
Modified:实体将由上下文跟踪并存在于数据库中,已修改其中的一些或所有属性值
11. 为什么用EF而不用原生的ADO.NET?
大的提高开发效率,EF是微软自己的产品,开发中代码都是强类型的
12. 如何提高LINQ性能问题?
在数据库中的表中定义合适的索引和键
只获得你需要的列和行
尽可能使用一条查询而不是多条
只为了展示数据,而不进行后续修改时,可以使用AsNoTracking,取消实体状态追踪
13. 什么是IEnumerable?
是一个接口,它只含有一个方法GetEnumerator
实现了这个接口的类可以使用Foreach关键字进行迭代,实现这个接口必须实现方法GetEnumerator
IEnumerable功能有限,不能插入和删除,访问IEnumerable只能通过迭代,不能使用索引器
在迭代时,只能前进不能后退,新的迭代不会记得之前迭代后值的任何变化
14. LINQ to Object和LINQ to SQL有何区别?
LINQ to SQL可以将查询表达式转换为SQL语句,然后在数据库中执行
LINQ to Object,则是将查询表达式直接转化为Enumerable的一系列方法,最终在C#内部执行
LINQ to Object的数据源总是实现IEnumerable,LINQ to SQL的数据源总是实现IQueryable并使用Queryable的扩展方法
15. 泛型的优点有哪些?
代码的可重用性。无需从基类型继承,无需重写成员,扩展性好
类型安全性提高。 泛型将类型安全的负担从你那里转移到编译器。 没有必要编写代码来测试正确的数据类型,因为它会在编译时强制执行。 降低了强制类型转换的必要性和运行时错误的可能性
性能提高。泛型集合类型通常能更好地存储和操作值类型,因为无需对值类型进行装箱
16. try {}里有一个return语句,finally 的code会不会被执行,什么时候被执行
会执行,在return前执行
17. 在c#中,反射是什么?
反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获 得.NET 中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等
18. GC是什么? 为什么要有GC?
GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理
.NET的GC机制有这样两个问题:首先,GC并不是能释放所有的资源。它不能自动释放非托管资源
GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性
GC就是对“不可达“的对象进行回收,释放内存
19. 应用程序池集成模式和经典模式的区别?
如果托管应用程序在采用集成模式的应用程序池中知运行,服务器将使用 IIS 和 ASP.NET 的集成请求处理管道来处理请求
如果托管应用程序在采用经典模式的应用程序池中运行,服务器会继续通过 Aspnet_isapi.dll 路由托管代码请求,其处理请求的方式就像应用程序在 IIS 6.0 中运行一样
20. 私有程序集与共享程序集有什么区别?
一个私有程序集通常为单个应用程序所使用,并且存储于这个应用程序所在的目录之中或此目录下的一个子目录中
共享程序集通常存储在全局程序集缓存(Global Assembly Cache)之中,这是一个由.NET运行时所维护的程序集仓库。共享程序集通常是对许多应用程序都有用的代码库,比如.NET Framework类
21. 什么是GAC?它解决了什么问题?
Gloal Assembly Cache,全局应用程序集缓存。它解决了几个程序共享某一个程序集的问题。不必再将那个被共
享的程序集拷贝到应用程序目录了,其实这道理很简单,.net应用程序在加载的时候,会首先查看全局应用程序
集缓存,如果有就可以直接使用,没有再到应用程序目录进行查找