C#(.net) 面试题
1、ASP.NET的页面生存周期
.aspx/.ashx->IIS->Asp.net_isapi.dll->HttpRuntime.ProcessRequest() ->HttpWorkerRequest->HttpContext(HttpRequest、HttpResponse)->HttpApplicationFactory创建HttpApplication.ProcessRequest() ,HttpApplication开始通过HTTP管道事件、处理程序(Handlers)和页面事件来处理请求了
方法执行过程如下:先执行httpApplication中的processRequest方法。在此方法中包含了要按照先后顺序执行的19个委托事件 当在执行到第8个事件的时候就开始创建被请求页面对象,在执行到第11和第12个事件之间时。就执行被创建的请求页面对象的ProcessRequest方法。
页面初始化 Page_Init
加载View State LoadViewState
回发数据处理 LoadPostData
页面加载 Page_Load
回发事件处理 RaisePostBackEvent
页面预渲染 Page_PreRender
保存 viewstate SaveViewState
Page渲染 Page_Render
Page 卸载 Page_UnLoad
2、asp.net检查页面是否第一次加载
IsPostBack 是否是事件回发
3一、.NET MVC的网页生命周期
步骤1:创建RouteTable
当ASP.NET应用程序第一次启动的时候才会发生第一步。RouteTable把URL映射到Handler。
步骤2:UrlRoutingModule拦截请求
第二步在我们发起请求的时候发生。UrlRoutingModule拦截了每一个请求并且创建和执行合适的Handler。
步骤3:执行MvcHandler
MvcHandler创建了控制器,并且把控制器传入ControllerContext,然后执行控制器。
步骤4:执行控制器
控制器检测要执行的控制器方法,构建参数列表并且执行方法。
步骤5:调用RenderView方法
大多数情况下,控制器方法调用RenderView()来把内容呈现回浏览器。Controller.RenderView()方法把这个工作委托给某个ViewEngine来做
4、C#中的 lock 关键字有何作用
C#中的lock关键字实质是调用 Monitor.Enter 和Monitor.Exit两个方法的简化语法,功能上其实现了进入和退出某个对象的同步。
列举几种实现页面跳转的方法
使用Response.Redirect 方法
使用Server.Transfer方法
使用Server.Execute 方法
使用javascript脚本
使用超链接
5 Session有哪几种存储方式,之间有何区别,如何进行设置
Session 数据一共有四种存储方式,分别为存储在 IIS进程中、状态服务器中、SQL Server数据库中和自定义程序中。除了准备必要的服务外(如 SQL Server数据库服务器),还需要配置站点的 Web.Config文件进行设置。
6、 委托回调静态方法和实例方法有何区别
当委托绑定静态方法时,内部的对象成员变量:_target 将会被设置成null,而当委托绑定实例方法时,_target将会设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法。
7、 什么是链式委托
链式委托是指一个由委托串成的链表,当链表上的一个委托被回调时,所有链表上该委托的后续委托将会被顺序执行。
8、C# 线程种类
Thread、 ThreadPool 线程池、Delegate 实现的多线程(委托线程)、Task 实现多线程、Parallel( 主要用于任务的并行)
9、ASP.NET 页面之间传递值的几种方式。
1.使用QueryString, 如....?id=1; response. Redirect()....
2.使用Session变量
3.使用Server.Transfer
4.使用Application
5.使用Cache
6使用HttpContext的Item属性
7.使用文件
8.使用数据库
9.使用Cookie
10、什么是受管制(托管)的代码?
托管代码是运行.NET 公共语言运行时CLR的代码。unsafe:非托管代码。不经过CLR运行。程序员自行分配和释放内存空间
11、.net中读写数据库需要用到那些类?他们的作用?
答:DataSet:数据集。
DataCommand:执行语句命令。
DataAdapter:数据的集合,用语填充。
DataReader:数据只读器
12、什么是Code-Behind技术?
答:代码后置。(asp.net中采用了页面“继承”的方式,即前台页面.aspx文件通过其页面指令@Page继承后台.cs文件,这样,不仅将页面的UI与逻辑分开,同时在程序编译后,其实现逻辑也被隐藏,以.dll文件代替。asp.net中的这种程序编写方式就被叫做code-Behind技术。)
13、foreach遍历访问的对象需要实现
IEnumberable接口和GetEnumberator方法
14、C# 集合类型由哪些
Dictionary< TKey,?TValue> 是 Hashtable 的泛型版本
KeyValuePair< TKey,?TValue> 而不是DictionaryEntry
List< T> 是 ArrayList 的泛型版本
Queue< T>对应Queue
Stack< T>对应Stack
SortedList< TKey,?TValue> 对应SortedList,这两个版本均为字典和列表的混合
Dictionary()、Hashtable
15 .net(C#)垃圾回收原理(GC) 标记对象(引用计数法)、压缩托管堆()
0代:从没有被标记为回收的新分配的对象
1代:在上一次垃圾回收中没有被回收的对象
2代:在一次以上的垃圾回收后仍然没有被回收的对象
16、谈谈final, finally, finalize的区别。
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此 一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中 不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final的方法也同样只能使用,不能重载
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会 执行,然后控制就会进入 finally 块(如果有的话)。
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理 工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的 ,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
17、Session有什么重大BUG,微软提出了什么方法加以解决?
答:是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。
18、ASP。NET与ASP相比,主要有哪些进步?
答:asp解释形,aspx编译型,性能提高,有利于保护源码。
19、简述 private、 protected、 public、 internal 修饰符的访问权限。
答 . private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 在同一命名空间内可以访问。
20、override与重载的区别
答 : override 与重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要
Override 是进行基类中函数的重写。实现多态。
21、CTS、CLS、CLR分别作何解释?
CTS:Common Type System 通用类型系统。Int32、Int16→int、String→string、Boolean→bool。每种语言都定义了自己的类型,.Net通过CTS提供了公共的类型,然后翻译生成对应的.Net类型。
CLS:Common Language Specification 通用语言规范。不同语言语法的不同。每种语言都有自己的语法,.Net通过CLS提供了公共的语法,然后不同语言翻译生成对应的.Net语法。
CLR:Common Language Runtime 公共语言运行时,就是GC、JIT等这些。有不同的CLR,比如服务器CLR、Linux CLR(Mono)、Silverlight CLR(CoreCLR)。相当于一个发动机,负责执行IL。
22、什么是装箱和拆箱?
答:从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱。
23、GC是什么? 为什么要有GC?
答:GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
24、在.NET中类(class)与结构(struct)的异同?
Class可以被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。
Struct属于值类型,是分配在内存的栈上的。结构体是复制传递的。
25、堆和栈的区别?
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
26、是否可以继承String类?
String类是sealed类故不可以继承。
27、using关键字有什么用?什么是IDisposable?
using可以声明namespace的引入,还可以实现非托管资源的释放,实现了IDisposiable的类在using中创建,using结束后会自动调用该对象的Dispose方法,释放资源。加分的补充回答:using其实等价于try……finally,用起来更方便。
28、说出一些常用的类、接口,请各举5个?
常用的类:StreamReader、WebClient、Dictionary<K,V>、StringBuilder、SqlConnection、FileStream、File、Regex、List<T>
常用的接口:IDisposable、IEnumerable、IDbConnection、IComparable、ICollection、IList、IDictionary
29、StringBuilder的实现原因:通过数组
30、文件夹、和文件的关键词
Directory、File
31、ASP.NET MVC Filter过滤机制(过滤器、拦截器)
1、ActionFilterAttribute 过滤器
2、AuthorizeAttribute 权限过滤器
3、HandleErrorAttribute 异常过滤器