asp.net面试题总结1(未完待续。。。。)

时间:2024-01-21 12:59:58

1、MVC中的TempData\ViewBag\ViewData区别?

答:页面对象传值,有这三种对象可以传。

asp.net面试题总结1(未完待续。。。。)

Temp:临时的

Bag:袋子

(1)  TempData  保存在Session中,Controller每次执行请求的时候,会从Session中先获取 TempData,而后清除Session,获取完TempData数据,虽然保存在内部字典对象中,但是其集合中的每个条目访问一次后就从字典表中删 除。具体代码层面,TempData获取过程是通过SessionStateTempDataProvider.LoadTempData方法从 ControllerContext的Session中读取数据,而后清除Session,故TempData只能跨Controller传递一次。

(2) ViewBag和ViewData只在当前Action中有效,等同于View

(3)ViewData和ViewBag 中的值可以互相访问,因为ViewBag的实现中包含了ViewData

2、ASP.NET和ASP.NET MVC的关系

答:

ASP.NET MVC是ASP.NET的子集

从mvc的核心命名空间System.Web.Mvc就能看出,因为System.Web是Asp.NET的核心命名空间。

ASP.NET MVC是在核心ASP.NET基础之上构建的。

具体体现在以下方面

(1)ASP.NET MVC依赖于HttpHandler

关于请求是怎么进入控制器的,其实就是用到了HttpHandler

(2)Session、Cookie、Cache和Application这些ASP.NET的对象保存机制在MVC中依然是需要用到的

(3)HttpContext、Request、Response、Server对象在MVC中仍然可以使用,在Controller中通过智能感知的形式很容易得到这些对象

3、阐述下MVC框架的机制,各个模块的作用?

答:

我们来了解MVC的三大组件(模型、视图、控制器)。
所谓模型,就是MVC需要提供的数据源,负责数据的访问和维护。
所谓视图,就是用于显示模型中数据的用户界面。
所谓控制器,就是用来处理用户的输入,负责改变模型的状态并选择适当的视图来显示模型的数据。
以下是我绘制的MVC三大组件之间的交互图。
asp.net面试题总结1(未完待续。。。。)
从交互图中可以看出,MVC从用户发送请求到页面呈现结果大致经历了五个步骤,分别如下:
(1). 用户在浏览器输入地址,向页面发送请求(实则是向控制器发出相关命令);
(2). 控制器接受命令后,向模型请求获得相关的数据;
(3). 模型将相应的数据返回给控制器;
(4). 控制器将相关数据发送到指定的视图;
(5). 指定的视图呈现相关的数据。
当启动MVC网站时,用户输入的URL地址将首先传递到UrlRoutingModule模块,该模块将解析该URL并选择对应的URL路由,并得到对应的IHttpContext对象来处理该URL路由。在默认情况下,该IHttpContext对象就是MvcHandler对象,通过该对象来选择相关的控制器来处理用户的请求。即UrlRoutingModule模块和MvcHandler对象是MVC网站的入口点,主要实现:选择对应的控制器,实例化控制器对象,调用控制器的相关方法。以下表格更详细地说明页面请求的执行过程。
asp.net面试题总结1(未完待续。。。。)
asp.net面试题总结1(未完待续。。。。)
总结:

1、UrlRoutingModule模块截获请求,从路由表中得到该URL对应的RouteData
2、RouteData+URL封装成一个IHttpContext对象
3、IHttpContext对象从RouteData中得到Controller名字,根据名字反射创建Controller对象
4、Controller对象执行对应的Action方法,并返回View()

4、存储过程的优缺点?
 答:
优点:
1.执行速度快。存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.减少网络通信量。当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
缺点:
1、可移植性差。不同的数据库语法不一样哦
5、drop、truncate、delete三者删除的区别?
答:

一:用法和区别

drop:drop table 表名

删除内容和定义,并释放空间。执行drop语句,将使此表的结构一起删除。

truncate (清空表中的数据):truncate table 表名

删除内容、释放空间但不删除定义(也就是保留表的数据结构)。与drop不同的是,只是清空表数据而已。

truncate不能删除行数据,虽然只删除数据,但是比delete彻底,它只删除表数据。

delete:delete from 表名 (where 列名 = 值)

与truncate类似,delete也只删除内容、释放空间但不删除定义;但是delete即可以对行数据进行删除,也可以对整表数据进行删除。

二:注意

1.delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存,以便进行进行回滚操作。

2.执行速度一般来说:drop>truncate>delete

3.delete语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。

4.truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发trigger。

5.truncate语句执行以后,id标识列还是按顺序排列,保持连续;而delete语句执行后,ID标识列不连续

6、描述EF和ado.net的优缺点?

答:

EF  优点:(1)面向对象编程

(2)代码量少,开发方便

缺点:(1)有一定的性能损耗

(2)优化的时候不灵活,不如直接写sql

ado.net 优点:(1)直接操作数据库,速度快

(2)优化sql灵活

缺点:(1)代码量大,自己处理的事情多

7、MVC的Filter有几种?分别是什么?主要特点是什么?

8、阐述下数据库的三大范式?

   答: 

第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。
个人理解:列不可分(原子性,即字段不可以再分)
第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
个人理解:不存在部分依赖(唯一性,不可以把多种数据保存在同一张表中,即一张表只能保存“一种”数据)
第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
个人理解:不存在传递依赖(直接性,每一列都和主键直接相关,而不能间接相关)

9、怎么理解线程池,他的优缺点有哪些?

答:  线程池是用来存放线程的对象池。线程池的目的就是因为创建一个线程代价比较高,因此我们使用线程池来复用线程。

优点:

(1)减少创建线程的开销,线程能复用

缺点:

(1)不能设置池中线程的优先级和名称

(2)线程池中的所有线程都是后台线程。如果进程的所有前台线程都结束了,所有的后台线程就会停止。不能把入池的线程改为前台线程

10、视图有更新操作,你不知道吗?

    答:

通过视图更新数据的必须条件
1、SELECT语句中没有使用聚合函数或Group by、Union、Distinct或Top子句
2、INSERT、UPDATE、DELETE语句必须满足一定的条件才能引用可更新的视图
通过视图更新数据的场景比较少,大家只是了解下视图可以更新就行了。
11、EntityFramework懒加载与预加载分别是设么?怎么理解
 答:
1、延迟加载又叫惰性加载(Lazy Loading):即在需要或者使用的时候加载数据。默认情况下,EF会使用延迟加载方式加载数据,即数据库上下文的属性:Configuration.LazyLoadingEnabled = true;
  eg:var customers = from c in dbcontext.Customer select c;
2、预加载:如果你想让所有数据一次性全部加载到内存中,那么你需要使用.Include(Entity)方法 。.Include(Entity)方法允许级联使用,你可以预先加载具有多层级结构的数据。
  eg:var q = from t in dbcontext.Customer.Include("Order") select t;
比较两种加载方式
预加载:
• 减少数据访问的延迟,在一次数据库的访问中返回所有的数据。不过缺点是,那就是如果数据量较大,一次性将所有数据载入内存往往并不是最明智的选择
• 减少与数据库的交互次数
延迟加载:
• 非常宽容,因为只在需要的时候加载数据,不需要预先计划
• 可能会因为数据访问的延迟而降低性能,考虑到每访问父实体的子实体时,就需要访问数据库。
3、显式加载和延迟加载非常类似,不同的是显式加载要手动关闭EF的延迟加载属性,通过代码ctx.Configuration.LazyLoadingEnabled = false;来完成。

(未完待续。。。。)