现在的位置: 首页 > 综合 > 正文

.NET笔试题集(五)

2012年07月25日 ⁄ 综合 ⁄ 共 10084字 ⁄ 字号 评论关闭

1.什么是受管制的代码? 

答:unsafe:非托管代码。不经过CLR运行。

 

2.net Remoting 的工作原理是什么? 
答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。

 

3.O/R Mapping 的原理 
答:利用反射,配置将对象和数据库表映射。

 

4.remoting和webservice两项技术的理解以及实际中的应用。 
答:WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。

 

5.out保留字怎么使用,什么时候使用。
答:有时为了从一个函数中返回多个值,我们需要使用out关键字,把输出值赋给通过引用传递给方法的变量(也就是参数)。但C#要求变量再被引用的前必须初始化。在调用该方法时,还需要添加out关键字。

 

6.PDB是什么东西? 在调试中它应该放在哪里?

答:PDB是用于保存调试和项目状态信息的文件,在debug的时候将产生pdb文件,调试的时候应该放在和对应应用程序集相同目录。

 

7.使用ASMX的XML Web服务与使用SOAP的.NET Remoting的区别?

答:Web服务使用的消息机制,而Remoting采用的RPC. Web Service能用于不同平台,不同语言,Remoting只适用于.Net。效率上Remoting高于Xml Web Service。

 

8.从概念上阐述前期绑定(early-binding)和后期绑定(late-binding)的区别?

这个就像是强弱类型的比较相似,前期绑定是在编译的时候就确定了要绑定的数据,而后期绑定是在运行的时候才填充数据。所以前期绑定如果失败,会在编译时报编译错误,而后期绑定失败只有在运行时的时候才发生。

 

9.概述反射和序列化

反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。

序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。

 

10.XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限?

我只知道XmlSerializer是将对象的属性和字段进行序列化和反序列化的,序列化成为xml数据,反序列化再将xml转换成对象。应该至少需要ACL权限中的读权限.

 

11.XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题?

只序列化有用的数据,而不是序列化整个对象。实现没必要的数据冗余,和提升序列化时的性能。

 

12.SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号,LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号

答:Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)

 

13.在对象比较中,对象一致和对象相等分别是指什么?a.Equals(b)和a == b一样吗?

对象一致是指两个对象是同一个对象,引用相同。而对象相等是指两个对象的值相同,但引用不一定相同。

不一样。a.Equals(b)表示a与b一致, a==b表示a与b的值相等。

 

14.请解释一下IClonable

IClonable方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。而Shadow复制则不同,是浅表复制,不重新创建新实例。浅表复制的实现是Object.MemberWiseClone().

深度复制(Deep Copy)与浅表复制(Shadow Copy)的比较 

View Code

public class Name 
    { 
        public string FirstName; 
        public string LastName; 
    } 
    public class Person:ICloneable 
    { 
        public Name PersonName; 
        public string Email; 
        /**//// <summary> 
        /// Deep Copy的例子 
        /// </summary> 
        /// <returns></returns> 
        public Object Clone() 
        { 
            Person p = new Person(); 
            p.Email = this.Email; 
            p.PersonName = new Name(); 
            p.PersonName.FirstName = this.PersonName.FirstName; 
            p.PersonName.LastName = this.PersonName.LastName; 
            return p; 
        }

        public void ChangLastName(string lastName) 
        { 
            this.PersonName.LastName = lastName; 
        } 
        public static void Main() 
        { 
            Person p = new Person(); 
            p.PersonName = new Name(); 
            p.PersonName.LastName = "jill"; 
            p.PersonName.FirstName = "zhang"; 
            p.Email = "jillzhang@126.com"; 
            Person sameNamePerson = p.Clone() as Person; 
            sameNamePerson.ChangLastName("clr_"); 
            Console.WriteLine(p.PersonName.LastName); 
            Console.WriteLine(sameNamePerson.PersonName.LastName);           

            Person samePerson = p.MemberwiseClone() as Person; 
            samePerson.ChangLastName("Shadow");

            Console.WriteLine(p.PersonName.LastName); 
            Console.WriteLine(sameNamePerson.PersonName.LastName); 
            Console.Read(); 
        } 
    }

 

15.特性能够放到某个方法的参数上?如果可以,这有什么用?

可以,作用可以对参数有进一步限定,比如输入参数为int类型,可以通过允许AttributeTargets=ParameterInfo的Attribute自定义实现来限定输入参数的大小,比如当输入参数小于100的时候便报错。对方法的参数设置Attribute的例子

View Code

  [AttributeUsage(AttributeTargets.Parameter)] 
    public class ParameterAtt : Attribute 
    { 
        public int Min = 100; 
    }

    public class AttributeTest 
    {       
        public void TestMethod([ParameterAtt(Min = 100)] int par1) 
        { 
            ParameterInfo para = MethodInfo.GetCurrentMethod().GetParameters()[0]; 
            ParameterAtt att = ParameterAtt.GetCustomAttribute(para, typeof(ParameterAtt)) as ParameterAtt; 
            if (att.Min > par1) 
            { 
                throw new Exception("要求para1最小为" + att.Min); 
            } 
        } 
    }

 

16.WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回。 

在web控件发生事件时,客户端采用提交的形式将数据交回服务端,服务端先调用Page_Load事件,然后根据传回的状态信息自动调用服务端事件自动传回,当我们在点击客户端控件时,采用提交表单的形式将数据直接传回到务端 只有通过自动传回才能实现服务端事件的机制,如果没有自动回传机制就只能调用客户端事件,而不能调用服务端事件。

 

17.请解释web.config文件中的重要节点 
appSettings包含自定义应用程序设置。 
system.web 系统配置 
compilation动态调试编译设置 
customErrors自定义错误信息设置 
authentication身份验证,此节设置应用程序的身份验证策略 
authorization授权, 此节设置应用程序的授权策略

 

18.请解释什么是上下文对象,在什么情况下要使用上下文对象 
上下文对象是指HttpContext类的Current 属性,当我们在一个普通类中要访问内置对象(Response,Request,Session,Server,Appliction等)时就要以使用此对象

 

19. 几十上百万行,如何快速查询出表数据 

答:用分页存储过程 

View Code

/* 
  函数名称: GetRecordFromPage 
  函数功能: 获取指定页的数据 
  参数说明: @tblName      包含数据的表名 
           @fldName      关键字段名 
           @PageSize     每页记录数 
           @PageIndex    要获取的页码 
           @OrderType    排序类型, 0 - 升序, 1 - 降序 
           @strWhere     查询条件 (注意: 不要加 where) 
*/ 
CREATE PROCEDURE GetRecordFromPage 
    @tblName      varchar(255),       -- 表名 
    @fldName      varchar(255),       -- 字段名 
    @PageSize     int = 10,           -- 页尺寸 
    @PageIndex    int = 1,            -- 页码 
    @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序 
    @strWhere     varchar(2000) = ''  -- 查询条件 (注意: 不要加 where) 
AS

declare @strSQL   varchar(6000)       -- 主语句 
declare @strTmp   varchar(1000)       -- 临时变量 
declare @strOrder varchar(500)        -- 排序类型

if @OrderType != 0 
begin 
    set @strTmp = '<(select min' 
    set @strOrder = ' order by [' + @fldName + '] desc' 
end 
else 
begin 
    set @strTmp = '>(select max' 
    set @strOrder = ' order by [' + @fldName +'] asc' 
end

set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
    + @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 
    + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
    + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)' 
    + @strOrder

if @strWhere != '' 
    set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
        + @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 
        + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
        + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' ' 
        + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

if @PageIndex = 1 
begin 
    set @strTmp = '' 
    if @strWhere != '' 
        set @strTmp = ' where (' + @strWhere + ')'

    set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
        + @tblName + ']' + @strTmp + ' ' + @strOrder 
end

exec (@strSQL)

GO

 

20.数据库查询优化: 
1、多态性,多种数据库兼容; 

2、支持翻页,支持查询总数,页码显示; 
3、能处理100万以上数据量; 
答: 

View Code

CREATE   PROCEDURE   dbo.LSP_SP_SelectElementByPage       
  @SelectFields   varchar(200),/*要查询的字段列表*/   
  @Condition   varchar(300),/*查询条件*/   
  @PageSize   int   =20,/*页面大小,默认为20*/   
  @PageNumber   int   =1/*页号,默认为第一页*/   
  /*@PageCount   int   out返回满足条件的总页数*/   
  AS   
  begin   
  declare   @count   int   
  select   @count   =count(*)   from   lsp_t_elementInfo   
  if(@count   %@PageSize=0)   
  set   @count   =   @count/@PageSize   
  else   
  set   @count   =   @count/@PageSize   +1   
  select   @count   PageCount   
  select   IDENTITY(int,1,1)   as   iid,ElementName,Type   into   #temptable   from   LSP_T_ElementInfo   
  select     *   from   #temptable   where   iid   between     @PageSize   *   (@PageNumber   -1)   and   @PageSize   *   @PageNumber   
  end   
  GO

 

21.两个表,写查询语句,根据两个字段一个是升序,一个将序。 

答:select * from a,b where a.字段1 = b.字段1 order by a.字段2 asc,b.字段2 desc

 

22.一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成。请用c#语言编写主要程序来实现。 

View Code

       using System.Text; 
StringBuilder sb = new StringBuilder(0, 10000); 
        string strABC = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"; 
        string[] ABC = strABC.Split(','); 
        int len = ABC.Length; 
        Random rd = new Random(); 
        for (int i = 0; i < 10000; i++) 
        { 
            sb.Append(ABC[rd.Next(len)]); 
        }

 

23.产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。 

View Code

int[] intArr=new int[100]; 
ArrayList myList=new ArrayList(); 
Random rnd=new Random(); 
while(myList.Count<100) 
{ 
int num=rnd.Next(1,101); 
if(!myList.Contains(num)) 
myList.Add(num); 
} 
for(int i=0;i<100;i++) 
intArr[i]=(int)myList[i];

 

24.用C#写一段选择排序算法,要求用自己的编程风格。 

View Code

    private int min; 
    public void xuanZhe(int[] list)//选择排序 
    { 
        for (int i = 0; i < list.Length - 1; i++) 
        { 
            min = i;
            for (int j = i + 1; j < list.Length; j++) 
            { 
                if (list[j] < list[min])

                    min = j;

            }
            int t = list[min];

            list[min] = list[i];

            list[i] = t;

        } 
    }

 

25.写一个函数计算当参数为N的值:1-2+3-4+5-6+7……+N 

View Code

    public int returnSum(int n) 
    { 
        int sum = 0; 
        for (int i = 1; i <= n; i++) 
        { 
            int k = i; 
            if (i % 2 == 0) 
            { 
                k = -k; 
            } 
            sum = sum + k; 
        } 
        return sum; 
    }

    public int returnSum1(int n) 
    { 
        int k = n; 
        if (n == 0) 
        { 
            return 0; 
        } 
        if (n % 2 == 0) 
        { 
            k = -k; 
        } 
        return aaa(n - 1) + k; 
    }

 

26.页面生命周期?

页面生命周期执行一系列步骤:页面的初始化、实例化控件、还原和维护状态、运行事件处理程序代码、呈现。为了在合适的阶段执行所需的代码,所以要对页面生命周期非常熟悉。在页生命周期的各个阶段,页面会逐个引发定义的事件,通过对代码开发,在页面的生命事件中执行我们所需要的程序;

27.页生命周期阶段?
1、页请求:发生在页面生命周期之前,用户请求页时,ASP.NET 将确定是否需要分析和编译页,从而确定是否开始页面的生命周期,或者是否可以在不运行页面的情况下发送页面缓存以进行响应;
2、开始:设置页属性,如:HttpContext 以及其他属性;在此阶段,页面需要确定是回发请求还是新请求,并设置 IsPostBack 属性;设置页面的 UICulture 属性;
3、页面初始化:加载所有主题;控件生成,并设置 UniqueID;
注:ViewState、ControlState中的值还未加载至控件;如果页面是回发,则回发数据也还未加载;故此时控件可以访问,但值可能出错;
4、加载:如果当前请求是回发请求,则为控件加载 ViewState 和 ControlState 中的值;
5、验证:调用所有验证程序控件的 Validate 方法,此方法将设置验证程序控件和页的 IsValid 属性;
6、回发事件处理:如果请求是回发请求,则调用所有事件处理程序;
7、呈现:首先对该页和所有控件进行保存视图状态,然后对每个控件调用 Render 方法,它会提供一个文本编写器,用于将控件的输入写入页的 Response 属性的 OutputStream 中;
8、卸载:完成呈现,并已将页发送至客户端、准备丢弃该页后,调用卸载。将卸载属性如:Response和Request等等;

28.生命周期事件?大概描述一下ASP.NET服务器控件的生命周期?

1、PreInit
完成操作:检查IsPostBack属性来确定是不是第一次处理该页;创建或重新创建动态控件;动态设置主控页;动态设置Theme属性;读取或设置配置文件属性;
注:如果请求是回发请求,则控件的值尚未从视图状态恢复,即:不应该在此事件中设置控件属性。
2、Init
完成操作:在所有控件都已经初始化并且应用所有外观设置后引发。使用该事件来读取和初始化控件属性;
3、InitComplete
完成操作:由Page对象引发,使用该事件来处理要求完成所有初始化工作的任务;
4、PreLoad
完成操作:为页和所有控件加载视图状态,然后处理 Request 实例包括的任何回发数据;
注:如果需要在Load之前对页或控件进行处理,需要该事件;
5、Load
完成操作:以递归方式加载所有控件;
6、控件事件
完成操作:处理控件引发的事件;
注:在回发请求中,如果页包含验证程序控件,请在执行任何处理之前检查Page和各个验证控件的IsValid属性;
7、LoadComplete
8、PreRender
在控件输出前最后的修改机会;
注:在该事件发生前的操作:Page对所有控件递归进行EnsureChildControl操作、设置了DataSourceID属性的数据绑定控件会调用DataBind方法;
9、SaveStateComplete
在该事件发生前,已经对控件的ViewState进行了保存。
10、Render
11、UnLoad
服务器控件的生命周期初始化、加载视图状态、处理回发数据、加载、发送回发更改通知、处理回发事件、预呈现、保存状态、呈现、处置、卸载;

29.应用程序生命周期?
在应用程序的生命周期期间,应用程序会引发可处理的事件并调用可重写的特定方法。若要处理应用程序事件或方法,可以在应用程序根目录中创建一个名为 Global.asax 的文件。如果创建了 Global.asax文件,ASP.NET 会将其编译为从 HttpApplication 类派生的类,然后使用该派生类表示应用程序;
HttpApplication 进程的一个实例每次只处理一个请求。由于在访问应用程序类中的非静态成员时不需要将其锁定,这样可以简化应用程序的事件处理过程。这样还可以将特定于请求的数据存储在应用程序类的非静态成员中。例如,可以在 Global.asax 文件中定义一个属性,然后为该属性赋一个特定于请求的值;
Application_Start 和 Application_End 方法是不表示 HttpApplication 事件的特殊方法。在应用程序域的生命周期期间,ASP.NET 仅调用这些方法一次,而不是对每个 HttpApplication 实例都调用一次;


30.ASP.NET 页面在什么时候产生?又在什么时候销毁?

1、Page_Init() —— 初始化对象
这一过程主要是初始化包括页面本身的所有控件,每次的页面载入就会执行一次初试过程,而在这里面访问到的也是控件的初始值。还有就是可以通过OnInit()来重载初试化事件;
2、LoadViewState() —— 导入ViewState数据
在初试化事件后,在 LoadViewState 事件中所有控件将获得他们的第一个属性 ViewState 属性,这个属性最终将被返回给服务器以判断这个页面是已经被用户访问完毕还是仍然在被用户所访问。也可重 LoadViewState 事件对相应的控件进行值设定;
3、LoadPostData() —— 用 LoadPostData 处理 Postback 数据
Postback数据也可以理解成就是服务器页面提交的表单数据,每一次表单数据的提交都会触发执行 IPostBackDataHandler 接口操作的控件;
4、Page_Load() —— 导入对象
这个过程就比较熟悉了,也是在页面的每次载入时一定会执行,但是注意和 PageInit() 之间的区别,所有的对象第一次被布置在 DOM 页面(在ASP.NET中称控件树)里了并且可以通过代码或是相关的位置被引用。这样,对象就可以很容易的从客户端获得诸如宽度、高度、值、可见性等在 HTML中的属性值。经常会用到的Page.IsPostBack()指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问;
5、Handle Control Events —— 具体的控件事件
这个过程执行的是相应具体控件事件;
6、Page_PreRender() —— 预先呈递对象
预先呈递对象可以改变对象并将改变保存的最后时刻。可以对控件的属性、控件树的结构等做出最后的修改,同时还不用考虑ASP.NET对其作出任何改变,因为此时已经脱离了数据库调用以及 ViewState 更新了,也可以通过OnPreRender来重载;
7、Page_Render() —— 呈递对象呈递页面
所有对页面控件的修改完成后 ViewState就被保存了。运用HTML创建给浏览器输出的页面的时候Render事件就发生了。在Render事件过程中,页面调用其中的对象将它们呈递给HTML。然后,页面就可以以HTML的形式被用户的浏览器访问了。当Render事件被重载时,开发者可以编写自定义的HTML代码使得原先生成的HTML都无效而按照新的HTML来组织页面。Render方法将一个 HtmlTextWriter 对象作为参数并用它将HTML在浏览器上以网页的形式显示。这时仍然可以做一些修改动作,不过它们只是客户端的一些变化而已了。亦可以重载Render事件;
8、Unload event —— 卸载对象
当想服务器请求一个对象的时候,就会在内存里生成一个继承页面对象,也就是页面的类,它继承自System.Web.UI.Page。当页面对象从内存中卸载时发生,将触发该事件;
9、Dispose method called
在呈递给HTML完成后,所有的对象都应被销毁。在Dispose事件中,你应该销毁所有在建立这个页面时创建的对象。这时所有的处理已经完毕,所以销毁任何剩下的对象都是不会产生错误的,包括页面对象。你可以重载Dispose事件;

 

作者: ForEvErNoME
出处: http://www.cnblogs.com/ForEvErNoME/
欢迎转载或分享,但请务必声明文章出处。如果文章对您有帮助,希望你能 推荐关注

 
 

抱歉!评论已关闭.