.NET面试题汇总
1、抽象类和接口的区别?
抽象类 | 接口 | |
---|---|---|
不同点 | 用abstract定义 | 用interface定义 |
只能继承一个类 | 可以实现多个接口 | |
非抽象派生类必须实现抽象方法 | 实现接口的类必须实现所有成员 | |
需要override实现抽象方法 | 直接实现 | |
相同点 | 不能实例化 | |
包含未实现的方法 | ||
派生类必须实现未实现的方法 |
2、什么是委托?
概念:委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用
委托的好处:
1.相当于用方法作为另一方法参数(类似于C的函数指针)
2.在两个不能直接调用的方法中作为桥梁,如:在多线程中的跨线程的方法调用就得用委托
3.当不知道方法具体实现什么时使用委托,如:事件中使用委托
3、什么是泛型
概念:通过参数化类型来实现在同一份代码上操作多种数据类型,利用“参数化类型”将类型抽象化,从而实现灵活的复用。
优点:使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。泛型最常见的用途是创建集合类。
缺点:在性能上不如数组快
记:通过参数化类型来实现在同一份代码上操作多种数据类型,使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。
4、装箱和拆箱
装箱:值类型转引用类型
拆箱:引用类型转值类型
5、值类型和引用类型分别有哪些?
值类型:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。
引用类型:数组,用户定义的类、接口、委托,object,字符串。
6、c#事件和委托的区别
使用位置不同:事件只能在本类型内部“触发”,委托不管在本类型内部还是外部都可以“调用”。
使用符号不同:在类的外部,事件只能用“+=”和“-=”去订阅/取消订阅,如果是委托的话还可以使用“=”。
7、MVC提交表单的几种方式
1、HtmlHelper方法
2、传统Form表单Aciton属性提交
3、Jquery+Ajax 提交表单
4、MVC Controller控制器和表单参数传递
8、NET中的错误处理机制是什么?
采用 try-catch-finally结构,发生错误时,层层上抛,直到找到匹配的catch为止。
9、什么是过滤器?
过滤器作用: 一般用于记录日志、异常处理、身份验证、行为记录等。
.Net MVC 常用的4种过滤器:
Action行为过滤器:在Action执行之前和执行之后调用
Result结果过滤器:在结果之前和之后调用。
Exception异常过滤器:在发生异常时调用。
Authorization权限效验过滤器:身份验证时调用。
10、垃圾(GC)回收机制
.net平台会自动把声明的那些不再使用的变量,或者是对象占用的空间释放, 而不用你自己书写代码实现这样的功能
11、C# 托管与非托管的理解
运行于.net平台上的代码,分配的资源一般会自动由平台的垃圾回收器释放,这样的资源就是托管资源。
但是一些例外的资源,如System.IO.StreamReader等各种流、各种连接所分配的资源,需要显式调用Close()或Dispose()释放,这种资源就叫做非托管资源。
12、a是10,b是15,不用中间变量交换 a ,b
a = a + b;
b = a - b;
a = a - b;
13、&和&&的区别
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)
14、post、get的区别
1.post的参数不会显示在浏览器地址栏中,get的参数会显示在浏览器地址栏中
2.用post可提交较大的数据量,get提交的数据量则非常小(2k)
3.用post可进行文件的提交,而用get则不可以
15、try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。
16、StringBuilder 和 String 的区别?
1.StringBuilder 是可扩展的,在大量字符串拼接时使用
2.String 在进行运算时会产生一个新的实例
17、Equal与==的区别
==操作符判断的是堆栈中的值,Equlas判断的是堆中的值
18、=、==和===的区别
=是赋值的意思
==是判断等于的意思
===也是判断的,但是它要比==判断的严谨一点,它的判断必须什么都相等,比如说类型
19、ADO.NET中读写数据库需用到哪些对象?作用是什么
DataConnection 连接数据库
DataCommand 执行语句命令
DataSet 数据存储器
DataAdapter 适配器,用于填充数据
DataReader 数据读取器,用于向前只读的数据流
20、详细描述三层架构开发模式以及三层架构的好处?
界面层:设计界面,与用户交互;
业务逻辑层(BLL):维护界面层和数据访问层之间的安全性,对传送的数据进行判断分析,将正确值进行传送;
数据访问层(DAL):主要是存放对数据类的访问,即对数据库的增删改查的操作;
好处:目的是“高内聚,低耦合“的思想,分工明确,条理清晰,易于调试 ,而且具有可扩展性
21.重写和重载的区别?
重写:当一个子类继承一个父类,而子类中的方法与父类中的方法名称、参数个数、参数类型一致时,就说明这个子类重写了父类的方法;
重载:方法名称相同,参数类型不同。调用时,编译器会根据实际传入参数的形式,选择与其匹配的行。
22、数组和集合的区别?
数组声明元素类型,集合不声明;
数组定长,占用内存小,速度快,集合不定长,占用内存大,速度慢;
数组存放类型只能是一种,集合不止一种
23、值类型和引用类型的区别?
值类型:存放在堆栈中,存储空间小,调用速度快,直接存储其值,从System.ValueType中派生,内存自动释放,简单类型,枚举,结构;
引用类型:存放在堆中,存储空间大,调用速度慢,存储对值的引用,从System.Object中派生,由GC自动释放,接口类型,数组类型,委托类型;
值类型的变量直接存储数据
引用类型的变量持有的是数据的引用,数据存储在数据堆中
24、请详细描述C#中的访问修饰符都有哪些?
private:私有成员,类内部可访问;
protected:保护成员,类内部和继承类可访问;
public:公开成员,没有访问限制;
internal:同一程序集可访问;
protected internal/internal protected:同一程序集和子类可访问
25、设计模式六大设计原则
单一职责原则:一个类值负责一个功能的职责
开闭原则:扩展开放,修改关闭。
里氏代换原则:使用父类的地方都能使用子类对象
依赖倒转原则:针对接口编程,
接口隔离原则:针对不同部分用专门接口,不用总接口,需要哪些接口就用哪些接口
迪米特法则: 软件实体类,尽量不与其他实体类发生关系相互作用,对外都统一的暴露接口就行了
26、面向对象三大特性
封装、继承、多态
27、你是如何理解面向对象思想?
面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
面向对象的特点:抽象,封装,继承,多态。
引用一段话:
假如我是上帝,我要造人(对象),首先,人要有思想,人要有肉体(这个过程就是抽象)
因为人数量大,我需要找别人帮我一起造人,但是我不想让知道我的技术,我可以把我的造人技术封装起来,他只知道他要做什么样的人类就好了【封装】
当我在造人的时候累了,我可能要用我之前造人的模板进行”复制“,”粘贴“。用模板造出来的人具有模板的特征,就像孩子一样具有父母的形状。【继承】
为了让人类更丰富一些,我们又对它进行了改变。这个过程叫多态【多态】
面向过程编程思想:
- 冰箱门打开,返回值是打开的冰箱门
- 大象装进去,返回值是打开的门,装进大象的冰箱
- 冰箱门关上,返回值是关着门装进大象的冰箱
面向对象的编程思想:
- 冰箱.开门()
- 冰箱.装进大象()
- 冰箱.关门()
- 万物皆对象
缺点:解决问题时候需要先创建对象
优点:更加贴近生活,解决问题。