面试题(.net概述)

以下内容转载自C#与.net面试宝典

1.基础认知


1.1介绍asp.net

解答:asp.net不是一门语言,而是动态创建网页的一种技术,他是.net框架中用于生成web应用程序和服务的技术,利用公共语言进行时在服务器后端为用户提供建立强大的企业级web应用服务的编程框架。


1.2说明asp.net的Application特性

解答:Application在开发中的作用是手机整个网站的信息,在应用程序的多用户之间共享信息,并能持久保存数据。并可用户在应用程序启动和退出时触发事件。


1.3简述asp.net的页面运行机制

ASP.NET之旅--浅谈Asp.net运行机制(一)


1.4简述asp.net一个页面的生命周期

解答:当ASP.NET运行库收到某个*.aspx的访问请求后,将开始这个页面的生命周期。首先,ASP.NET运行库将调用这个页面类的默认构造函数,对应的页面对象将在内存中创建,这个页面类即为*.cs代码文件中定义的类(派生于System.Web.UI.Page类)。页面对象创建后,将触发一系列的事件,这些事件的过程主要为:Init、Load和PreRend,当页面周期结束时将触发Unload事件。

解析:

本题在ASP.NET相关的面试中出现频率很高,因为ASP.NET虽然和ASP名称相似,其内部原理却相差甚远。通过ASP.NET页面的生命周期分析,可以从整体上把握页面编程的原理,以解决实际中的页面事件问题。ASP.NET页面的生命周期中的事件及相应分析如下:

1.Init过程

该过程即为页面初始化过程,严格细分后,这个时候应该有3个事件,按触发顺序依次为PreInit、Init和InitComplete事件。其中PreInit事件在页面初始化开始时发生,这时ASP.NET框架开始分配WEB控件、确定母版页以及设置用户个性化设置等。并且所有设计时创建的控件都将使用默认值进行初始化,例如,在*.aspx文件中有控件标签编写如以下代码所示。
<asp:Label runat="server" ID="MyLb" Text=”Hello” />
这时,字符串“Hello”将被赋值给“ID”属性为“MyLb”的Label控件。不仅如此,编程者还可以在该事件的处理方法中动态地创建控件。
接着是Init事件和InitComplete事件。InitComplete事件在初始化过程完成时触发,页面中声明的所有控件都已初始化,但页面的状态(ViewState)尚未填充。
Init过程在页面初始化时发生。这个时候,编程者可以读取控件的属性(在设计模式中所设置的),但是不能读取用户设置的值。因为得到用户设置的值是在LoadPostData()事件被触发之后,但是编程者可以获取POST数据。Init过程可以区分*.aspx中的控件是否为动态控件,在此过程之前加入到控件树的控件其处理过程就和*.aspx中静态声明的一致。在页面初始化的过程中不能使用ViewState,因为此时ViewState还没加载。

2.Load过程
即页面载入过程。如果页面是回发的(即“IsPostBack==true”),那么首先将触发LoadViewState事件,ASP.NET运行库将从隐藏域(隐藏字段)中分离出ViewState并加载到所有启用了ViewState的控件。接着还将触发LoadPostBackData事件,即可实现了IPostBackDataHandler接口的控件(如TextBox)从HTTP的POST数据中得到值。
当然,如果页面是首次访问,则没有以上两个事件,Load过程同样可分为PreLoad、Load、LoadComplete这三个事件。在整个Load过程中,页面与其控件已经完全初始化,这时,编程者编写代码与WEB页面所有的部件交互是安全的。“Page_Load”方法是使用比较频繁的事件处理方法,编程者即可在方法中编写页面载入时所要执行的代码。在LoadComplete事件之前会再次尝试加载POST数据,和第一次一样,不过第一次执行时已在控件树上的控件不会受到第二次影响。

3.PreRender过程
主要包括PreRender、PreRenderComplete事件。这时,所有控件数据绑定和界面配置都已经完成,控件已经准备好将数据呈现到即将发出的HTTP响应中,并且编程者可以决定每个变量的最终值。

4.Unload过程
页面已经完成了整个呈现过程,并且这个页面对象将被销毁。这时编程者不能与输出HTTP响应进行交互,但是可以进行其他的清除工作。
说明:所有的Page类型的事件都与System.EventHandler委托类型配合工作。

1.5 C#中托管代理是什么?

分析:

托管代码(Managed Code)实际上就是中间语言(IL)代码。

代码编写完毕后进行编译,此时编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。

程序集(Assembly)的文件负责封装中间语言,程序集中包含了描述所创建的方法、类以及属性的所有元数据。

托管代码在公共语言运行库(CLR)中运行。这个运行库给运行代码提供了多种服务,通常来说,公共语言运行库可以加载和验证程序集,并以此来保证中间语言的正确性。

当某些方法被调用时,公共语言运行库把具体的方法编译成适合本地计算机运行的机器码,并且将编译好的机器码缓存起来,以备下次调用时使用。这个过程就是即时编译。 

注意:程序实际上是被“托管”在公共语言运行库中。随着程序集的运行,公共语言运行库会持续地提供各种服务,例如内存管理、安全管理、线程管理等等。

总结:

托管代码(Managed Code)是由公共语言运行库(CLR)执行的代码,而不是由操作系统直接执行。

托管代码也可以调用CLR的运行库服务和功能,比如GC、类型检查、安全支持等等。这些服务和功能提供独立与开发语言的、统一的Managed Code应用程序行为。

1.6 C#中非托管代码是什么?

分析:

非托管代码(Unmanaged Code)是指直接编译成目标计算机的机器码,这些代码只能运行在编译出这些代码的计算机上,或者是其他相同处理器或者几乎一样处理器的计算机上。

非托管代码不能享受公共语言运行库所提供的一些服务,例如内存管理、安全管理等。 

如果非托管代码需要进行内存管理等服务,就必须显式地调用操作系统的接口,通常非托管代码调用Windows SDK所提供的API来实现内存管理。

非托管程序也可以通过调用COM接口来获取操作系统服务。

注意:C#跟Visual Studio平台的其他编程语言不一样的是,C#可以创建托管程序与非托管程序。当创建的项目选择名字以MFC,ATL或者Win32开头的项目类型,那么这个项目所产生的就是非托管程序。

总结:

非托管代码(Unmanaged Code)不由CLR公共语言运行库执行,而是由操作系统直接执行的代码。

非托管代码必须自己提供垃圾回收,类型检查,安全支持等等服务。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值