经典.NET面试题 C# ASP.NET面试题(二)

分类:.Net知识问答| 发布:camnprbubuol| 查看: | 发表时间:2013/5/23

概述反射和序列化

反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对

象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,

可以调用类型的方法或访问其字段和属性

序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通

过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。

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

我只知道XmlSerializer是将对象的属性和字段进行序列化和反序列化的,序列化成为xml数据,反序列化再将xml

转换成对象。应该至少需要ACL权限中的读权限.

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

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

 

26.根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写: 
namespace test 

public delegate void OnDBOperate(); 
public class UserControlBase : System.Windows.Forms.UserControl 

public event OnDBOperate OnNew; 
privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e) 

if(e.Button.Equals(BtnNew)) 

//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。 



答:if( OnNew != null )  
    OnNew( this, e );

27.分析以下代码,完成填空 
string strTmp = "abcdefg某某某"; 
int i= System.Text.Encoding.Default.GetBytes(strTmp).Length; 
int j= strTmp.Length; 
以上代码执行完后,i= j= 
答:i=13,j=10

28.SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号,

LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号 
答:Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)

29.根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。 
public void test(int i) 

   lock(this) 

   if (i>10) 
   { 
     i--; 
     test(i); 
   } 


答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果

把int换做一个object,那么死锁会发生)

3) 什么叫圈复杂度(cyclomatic complexity)?为什么它很重要?

不知道,望指教 ?

4) 写一个标准的lock(),在访问变量的前后创建临界区,要有"双重检查",

见:评论回复

5) 什么叫FullTrust?放入GAC的assembly是否是FullTrust的?

FullTrust完全信任。放入GAC中的Assembly是否FullTrust我的理解不是。我理解FullTrust是可以通过代码设定的

6) 代码加上需要安全权限的特性有什么好处?

可以更加灵活的设置对代码的访问权限,实现代码级保护。?这点不是特清楚,有明白的给讲解下

7) gacutil /l | find /i "Corillian" 这句命令的作用是什么?

全局程序集缓存中如果有Corillian就更新该程序集,没有就安装

8) sn -t foo.dll 这句命令是干嘛的?

显示程序集foo.dll的公钥标记

9) DCOM需要防火墙打开哪些端口?端口135是干嘛用的?

135端口,因为DCOM的端口号是随机分配的,默认情况下,会分配1024以上的端口号,所以默认情况下,DCOM

不能穿越防火墙。因为根本不晓得开哪个端口。但有解决办法可以使DCOM分配的端口号固定,135是远程过程

调用(RPC)的默认端口

10)对比OOP和SOA,它们的目的分别是什么?

我想OOP和SOA应该没有对比性吧。OOP是一种编程模型,强调将复杂的逻辑分解出小的模块,特性是继承,封

装和多态 。而SOA是一个技术框架,技术框架和编程模型应该说不是一码事吧?SOA的思想是将业务逻辑封装

成服务或者中间件提供给应用程序来调用,当然其组件化思想是继承和发扬了OOP的优点。

 

13)Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?

Debug.Write是调试的时候向跟踪窗口输出信息。当编译模式为debug的时候才有效,为release的时

候Debug.Write在编译的时候会忽略,而Trace则是在debug和release两种模式下均可以向跟踪窗口输出信息。

14)Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。

Debug会产生pdb文件,release不会。Debug用于开发时的调试,不能要于部署,而release用于部署.debug编

译一些特殊代码,比如#IFDEBUG Debug.Write等,而Release则会将那些特殊标记省略

15)JIT是以assembly为单位发生还是以方法为单位发生?这对于工作区有何影响?

方法,道理很简单,因为对于一次运行,很可能只用到一个程序集中极少数类型和对象,而大部分可能并不会被

使用,此时CLR傻乎乎的给整个程序集都给Compile了,CLR不是傻疯了么 

17)a.Equals(b)和a == b一样吗?

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

18)在对象比较中,对象一致和对象相等分别是指什么?

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

19)在.NET中如何实现深拷贝(deep copy)?

实现IClonable接口

20)请解释一下IClonable

IClonable方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造

方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。而Shadow复制则不同,是浅表复制,不重新

创建新实例。浅表复制的实现是Object.MemberWiseClone().

深度复制(Deep Copy)与浅表复制(Shadow Copy)的比较 
  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(); 
        } 
    }

 

24)为什么不应该在.NET中使用out参数?它究竟好不好?

我挺喜欢用out参数的,特别是当函数需要有多于1个返回的时候,我比较愿意用out,至于它好不好没研究过 ?

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

可以,作用可以对参数有进一步限定,比如输入参数为int类型,可以通过允许AttributeTargets=ParameterInfo

的Attribute自定义实现来限定输入参数的大小,比如当输入参数小于100的时候便抱错。

对方法的参数设置Attribute的例子 
  [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); 
            } 
        } 
    }

 

 

9.执行下面代码后:

String strTemp ="abcdefg 某某某";

Int i System.Text.Encoding.Default.GetBytes(strTemp).Length;

Int j = strTemp.Length;

问:i=(14 ) ;j=(11 )

i=(14 ) ;j=(11 ) 中文两个字节

12.概述.NET里对 remoting 和 webservice 两项技术的理解和实际中的应用。

远程逻辑调用,remoing接口只能用在.net中

 

9.  如何给服务器端控件增加客户端脚本。 
答:控件的Attributes

6. 私有程序集与共享程序集有什么区别? 
一个私有程序集通常为单个应用程序所使用,并且存储于这个应用程序所在的目录之中,或此目录下面的一个子

目录中。共享程序集通常存储在全局程序集缓存(Global Assembly Cache)之中,这是一个由.NET运行时所维

护的程序集仓库。共享程序集通常是对许多应用程序都有用的代码库,比如.NET Framework类。

10 .请解释ASP.NET中以什么方式进行数据验证 
Aps.net 中有非空验证,比较验证,取值范围验证,正则表达式验证及客户自定义验证五大控件,另还有一个集

中验证信息处理控件

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

使用自动传回。 
在web控件发生事件时,客户端采用提交的形式将数据交回服务端,服务端先调用Page_Load事件,然后根据传

回的状态信息自动调用服务端事件自动传回是当我们在点击客户端控件时,采用提交表单的形式将数据直接传回

到务端 
只有通过自动传回才能实现服务端事件的机制,如果没有自动回传机制就只能调用客户端事件,而不能调用服务

端事件

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

14.  请解释ASP。NET中的web页面与其隐藏类之间的关系? 
一个ASP.NET页面一般都对应一个隐藏类,一般都在ASP.NET页面的声明中指定了隐藏类例如一个页面Tst1.aspx

的页面声明如下 
<%@ Page language="c#" Codebehind="Tst1.aspx.cs" AutoEventWireup="false" Inherits="T1.Tst1" %> 
Codebehind="Tst1.aspx.cs" 表明经编译此页面时使用哪一个代码文件 
Inherits="T1.Tst1" 表用运行时使用哪一个隐藏类

15.  什么是viewstate,能否禁用?是否所用控件都可以禁用? 
Viewstate是保存状态的一种机制,EnableViewState属性设置为false即可禁用

16.  当发现不能读取页面上的输入的数据时很有可能是什么原因造成的?怎么解决? 
很有可能是在Page_Load中数据处理时没有进行Page的IsPostBack属性判断

17.  请解释什么是上下文对象,在什么情况下要使用上下文对象 
上下文对象是指HttpContext类的Current 属性,当我们在一个普通类中要访问内置对

象(Response,Request,Session,Server,Appliction等)时就要以使用此对象

 

16、解释一下ajax及实现原理 
答:Ajax的核心是JavaScript对象XmlHttpRequest,它使您可以使用JavaScript向服务器提出请求并处理响应, 而不阻塞用户,异步请求。

 

1、delegate是引用类型还是值类型?enum、int[]和string呢(难度系数40%)?

答案:delegate引用类型,enum值类型,int[]引用类型,string引用类型。

3、base这个关键字有哪几种语法?override呢?

答案:base两个语法,分别是调用基类构造函数和调用基类方法,override用于重写基类方法。

4、请指出C#中是否有下列关键字?virtual、sealed、abstract、import、as、in、goto、final、Const、signed、

String(提示,仅指出C#中没有的即可)(难度系数50%)。

答案:没有的关键字:import、final、Const、signed、String

5、在循环:for( int i = 0; i < 100; i++ ) Console.WriteLine( i );中,请指出i++的执行时机。

答案:在Console.WriterLine( i );执行之后

6、试说明continue关键字的用处。

答案:马上开始下一次循环,忽略循环体余下的语句

7、object是C#的关键字吗?请指出C#中有哪些类型关键字,如int、float。(提示,写得越多越好)。

答案:是,object、int、uint、long、ulong、short、ushort、byte、sbyte、char、float、double、decimal、boo

l,如回答:enum、struct、class、delegate也算对。

8、C#的XML文档注释中(以///开头的注释),<summary>标签用于描述什么?<param>标签呢?

答案:<summary>用于某个元素的概要说明,<param>用于某个方法的参数概要说明。

9、我们知道[]是数组和索引器的访问操作符,但它还有一个语法,是什么?

答案:特性(Attribute)

18.请叙述属性与索引器的区别。 
属性 索引器     
  通过名称标识。 通过签名标识。     
  通过简单名称或成员访问来访问。 通过元素访问来访问。     
  可以为静态成员或实例成员。 必须为实例成员。     
  属性的   get   访问器没有参数。 索引器的   get   访问器具有与索引器相同的形参表。     
  属性的   set   访问器包含隐式   value   参数。 除了   value   参数外,索引器的   set   访问器还具有与索引

器相同的形参表。

1) 描述线程与进程的区别?

线程(Thread)与进程(Process)二者都定义了某种边界,不同的是进程定义的是应用程序与应用程序之间的边

界,不同的进程之间不能共享代码和数据空间,而线程定义的是代码执行堆栈和执行上下文的边界。一个进程可

以包括若干个线程,同时创建多个线程来完成某项任务,便是多线程。而同一进程中的不同线程共享代码和数据

空间。用一个比喻来说,如果一个家庭代表一个进程,在家庭内部,各个成员就是线程,家庭中的每个成员都有

义务对家庭的财富进行积累,同时也有权利对家庭财富进行消费,当面对一个任务的时候,家庭也可以派出几个

成员来协同完成,而家庭之外的人则没有办法直接消费不属于自己家庭的财产。

2) 什么是Windows服务,它的生命周期与标准的EXE程序有什么不同

Windows服务是运行在windows后台指定用户下(默认System)的应用程序,它没有标准的UI界面,想比标准

的EXE程序,Windows服务是在服务开始的时候创建,而在服务结束的时候销毁,而且可以设置服务是否与操作

系统一起启动,一起关闭。它支持三种方式:1)自动方式 2)手动方式 3)禁用 。自动方式的时

候,windows服务将在OS启动后自动启动运行,而手动方式则必须手工启动服务,禁用的情况下服务将不能被

启动。另外标准的EXE默认使用的当前登录的用户,而windows服务则默认使用System用户,这在对系统资源访

问的时候特别需要注意。

3)  Windows单个进程所能访问的最大内存量是多少?它与系统的最大虚拟内存一样吗?这对于系统设计有什么

影响?

这个需要针对硬件平台,公式为单个进程能访问的最大内存量=2的处理器位数次方/2,比如通常情况下,32位

处理器下,单个进程所能访问的最大内存量为:232 /2 = 2G 。单个进程能访问的最大内存量是最大虚拟内存

的1/2,因为要分配给操作系统一半虚拟内存。

4)  什么是强类型,什么是弱类型?哪种更好些?为什么?

强类型是在编译的时候就确定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会确定类型。没有

好不好,二者各有好处,强类型安全,因为它事先已经确定好了,而且效率高。一般用于编译型编程语

言,如c++,java,c#,pascal等,弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编

程语言,如javascript,vb等

5)  PID是什么?在做系统的故障排除时如何使用它?

PID是进程编号,在系统发现故障的时候,可以根据它寻找故障所发生的具体进程,并且可通过visual studio.net

等ide将故障进程附加到进程中进行调试(debug)

6)  单个TCP/IP端口上能够被多少个进程侦听?

1个

7)  什么是GAC?它解决了什么问题?

Gloal Assembly Cache,全局应用程序集缓存。它解决了几个程序共享某一个程序集的问题。不必再将那个被共

享的程序集拷贝到应用程序目录了,其实这道理很简单,.net应用程序在加载的时候,会首先查看全局应用程序

集缓存,如果有就可以直接使用,没有再到应用程序目录进行查找。

1.白盒测试和黑盒测试 
答:黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。

白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成

分是否以经过检查。

软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看做一个黑盒子,测试人员完全

不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明

。因此黑盒测试又叫功能测试或数据驱动测试。黑盒测试主要是为了发现以下几类错误:

1、是否有不正确或遗漏的功能?

2、在接口上,输入是否能正确的接受?能否输出正确的结果?

3、是否有数据结构错误或外部信息(例如数据文件)访问错误?

4、性能上是否能够满足要求?

5、是否有初始化或终止性错误?

软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个打开的盒子,它允许

测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不

同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。白盒

测试主要是想对程序模块进行如下检查:

1、对程序模块的所有独立的执行路径至少测试一遍。

2、对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测一遍。

3、在循环的边界和运行的界限内执行循环体。

4、测试内部数据结构的有效性,等等。

请简述一下用Socket进行同步通讯编程的详细步骤 
1、在应用程序和远程设备中使用协议和网络地址初始化套接字 
2、在应用程序中通过指定端口和地址建立监听 
3、远程设备发出连接请求 
4、应用程序接受连接产生通信scoket 
5、应用程序和远程设备开始通讯(在通讯中应用程序将挂起直到通讯结束) 
6、通讯结束,关闭应用程序和远程设备的Socket回收资源

OSI网络结构的七层模型及其核心思想是什么 
第七层:应用层  
     定义了用于在网络中进行通信和数据传输的接口 - 用户程式;  
     提供标准服务,比如虚拟终端、文件以及任务的传输和处理; 
第六层:表示层 
    掩盖不同系统间的数据格式的不同性; 
    指定独立结构的数据传输格式; 
    数据的编码和解码;加密和解密;压缩和解压缩 
第五层:会话层 
    管理用户会话和对话; 
    控制用户间逻辑连接的建立和挂断; 
    报告上一层发生的错误 
第四层:传输层 
    管理网络中端到端的信息传送; 
    通过错误纠正和流控制机制提供可靠且有序的数据包传送; 
    提供面向无连接的数据包的传送; 
第三层:网络层 
    定义网络设备间如何传输数据; 
    根据唯一的网络设备地址路由数据包; 
    提供流和拥塞控制以防止网络资源的损耗 
第二层:数据链路层  
    定义操作通信连接的程序;  
    封装数据包为数据帧;  
    监测和纠正数据包传输错误 
第一层:物理层  
    定义通过网络设备发送数据的物理方式;  
    作为网络媒介和设备间的接口; 
    定义光学、电气以及机械特性。

 

 

2 几十上百万行,如何快速查询出表数据 
答:用分页存储过程 
/* 
  函数名称: 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

三、数据库查询优化: 
1、多态性,多种数据库兼容; 
2、支持翻页,支持查询总数,页码显示; 
3、能处理100万以上数据量; 
答: 
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

1.两个表,写查询语句,根据两个字段一个是升序,一个将序。 
答:select * from a,b where a.字段1 = b.字段1 order by a.字段2 asc,b.字段2 desc 
2.根据第一题,每页面显示10条记录,在第25页时怎样显示 
答: 
/* 
  函数名称: 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

2.写出一条Sql语句: 取出表A中第31到第40记录(SQLServer, 以自动增长的ID作为主键,  注意:ID可能不是连续的。) 
select top 10 * from A where id not in (select top 30 id from A) 
解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)

3.public class c{ public c(string a) : this() {;}; public c() {;} } 解释第一个构造函数中发生了什么?这个构造函数有什么用? 
(第一个构造函数调用了第二个构造函数,这个构造函数构造了一个c对象的实例。)

4.一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成。请用c#语言编写主要程序来实现。 
答: 
       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)]); 
        }

5.产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。 
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];

2.如何把一个Array复制到ArrayList里 
答: 
foreach( object o in array )arrayList.Add(o);

8.用C#写一段选择排序算法,要求用自己的编程风格。 
答: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;

        } 
    }

4.写一个函数计算当参数为N的值:1-2+3-4+5-6+7……+N 
答: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; 
    }

7. 某一密码仅使用K、L、M、N、O共5个字母,密码中的单词从左向右排列,密码单词必须遵循如下规则 : 
(1) 密码单词的最小长度是两个字母,可以相同,也可以不同 
(2) K不可能是单词的第一个字母 
(3) 如果L出现,则出现次数不止一次 
(4) M不能使最后一个也不能是倒数第二个字母 
(5) K出现,则N就一定出现 
(6) O如果是最后一个字母,则L一定出现 
问题一:下列哪一个字母可以放在LO中的O后面,形成一个3个字母的密码单词? 
A) K B)L C) M D) N 
答案:B 
问题二:如果能得到的字母是K、L、M,那么能够形成的两个字母长的密码单词的总数是多少? 
A)1个 B)3个 C)6个 D)9个 
答案:A 
问题三:下列哪一个是单词密码? 
A) KLLN B) LOML C) MLLO D)NMKO 
答案:C

62-63=1 等式不成立,请移动一个数字(不可以移动减号和等于号),使得等式成立,如何移动? 
答案:62移动成2的6次方

17、列出常用的使用javascript操作xml的类包 
答: 
XML.prototype.xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 
XML.prototype.InitXML=InitXML; 
XML.prototype.getFirstChild=getFirstChild; 
XML.prototype.getLastChild=getLastChild; 
XML.prototype.getChild=getChild;      // 取得节点值 
XML.prototype.getNodeslength=getNodeslength;   // 最得节点下的子节点的个数 
XML.prototype.getNode=getNode;       // 取得指定节点 
XML.prototype.delNode=delNode;       // 删除指定节点,如果节点相同,则删除最前面的节点. 
XML.prototype.getNodeAttrib=getNodeAttrib;    // 取得节点的指定属性值. 
XML.prototype.InsertBeforeChild=InsertBeforeChild;  // 在指定节点之前插入一个节点. 
XML.prototype.InsertChild=InsertChild;     // 在指定节点下插入节点. 
XML.prototype.setAttrib=setAttrib;      //  设置指定属性的值. 
XML.prototype.setNodeValue=setNodeValue;    //  设置指定节点的值. 
XML.prototype.CreateNodeS=CreateNodeS;     //  创建一个指定名的节点. 
XML.prototype.addAttrib=addAttrib;      //  为指定节点添加指定属性,并设置初值. 
XML.prototype.FindString=FindString;     // 在指定节点下查找字符串.

给定以下XML文件,完成算法流程图<FileSystem> 
< DriverC > 
<Dir DirName=”MSDOS622”> 
<File FileName =” Command.com” ></File> 
</Dir> 
<File FileName =”MSDOS.SYS” ></File> 
<File FileName =” IO.SYS” ></File> 
</DriverC> 
</FileSystem> 
请画出遍历所有文件名(FileName)的流程图(请使用递归算法)。 
答: 
void FindFile( Directory d ) 

FileOrFolders = d.GetFileOrFolders(); 
foreach( FileOrFolder fof in FileOrFolders ) 

if( fof is File ) 
You Found a file; 
else if ( fof is Directory ) 
FindFile( fof ); 

}

6.C#代码实现,确保windows程序只有一个实例(instance) 

        ///<summary> 
        ///应用程序的主入口点。 
        ///</summary> 
        [STAThread] 
        staticvoid Main() 
        { 
            //防止程序多次运行 
            if(!OneInstance.IsFirst("GetPayInfo")) 
            { 
                MessageBox.Show ("警告:程序正在运行中! 请不要重复打开程序!可在右下角系统栏找到!","程序错误提示:",MessageBoxButtons.OK,MessageBoxIcon.Stop); 
                return; 
            } 
            Application.Run(new Form1()); 
        } 
        // ******************* 防止程序多次执行 ************************** 
        publicabstractclass OneInstance 
        { 
            ///<summary> 
            ///判断程序是否正在运行 
            ///</summary> 
            ///<param name="appId">程序名称</param> 
            ///<returns>如果程序是第一次运行返回True,否则返回False</returns> 
            publicstaticbool IsFirst(string appId) 
            { 
                bool ret=false; 
                if(OpenMutex(0x1F0001,0,appId)==IntPtr.Zero) 
                { 
                    CreateMutex(IntPtr.Zero,0,appId); 
                    ret=true; 
                } 
                return ret; 
            }  
            [DllImport("Kernel32.dll",CharSet=CharSet.Auto)] 
            privatestaticextern IntPtr OpenMutex( 
                uint dwDesiredAccess, // access 
                int bInheritHandle,    // inheritance option 
                string lpName          // object name 
                ); 
            [DllImport("Kernel32.dll",CharSet=CharSet.Auto)] 
            privatestaticextern IntPtr CreateMutex( 
                IntPtr lpMutexAttributes, // SD 
                int bInitialOwner,                       // initial owner 
                string lpName                            // object name 
                ); 
        }

 

 

 

创建一个本地的委托副本

很多人都在使用的, 微软建议的模式: 创建一个本地的委托副本.


public class LocalCopyMessenger : IMessenger
{
public event EventHandler<MessageReceivedEventArgs> MessageReceived;


// 当我们引发事件时, 做一个副本
public void OnNewMessage(string message)
{
  var target = MessageReceived;

  if (target != null)
  {
    target(this, new MessageReceivedEventArgs(message));
  }
}
}

********************************************************************************

 static void Main(string[] args)
{
  int[] array = { 2, 9, 34, 201 };
  Console.Write(binary_search(array, array.Count(), 9));
  Console.ReadKey();
  //输出1
}
/// <summary>
/// 二分查找
/// </summary>
/// <param name="array">数组</param>
/// <param name="n">个数</param>
/// <param name="value">查找的值</param>
/// <returns></returns>
public static int binary_search(int[] array, int n, int value)
{
  int left = 0;
  int right = n - 1;
  while (left <= right)
  {
    int middle = left + ((right - left) >> 1);
    if (array[middle] > value)
    {
      right = middle - 1;
    }
    else if (array[middle] < value)
    {
        left = middle + 1;
    }
    else
    return middle;
  }
  return -1;
}

************************************************************************

static void Main(string[]args)
{
  int[]array={2,9,34,201};
  string sourc="abaabcaba";
  string pattern="abc";
  Console.WriteLine(kmp_find(sourc,pattern));
  compute_overlay(sourc);
  Console.ReadKey();
}
public static int kmp_find(string target,string pattern)
{
  int target_length=target.Length;
  int pattern_length=pattern.Length;
  int[]overlay_value=new int[pattern_length];
  overlay_value[0]=-1;
  int index=0;
  for(int i=1;i<pattern_length;++i)
  {
    index=overlay_value[i-1];
    while(index>=0&&pattern[index+1]!=pattern[i])
    {
      index=overlay_value[index];
    }
    if(pattern[index+1]==pattern[i])
    {
      overlay_value[i]=index+1;
    }
    else
    {
      overlay_value[i]=-1;
    }
  }
  int pattern_index=0;
  int target_index=0;
  while(pattern_index<pattern_length&&target_index<target_length)
  {
  if(target[target_index]==pattern[pattern_index]){
  ++target_index;
  ++pattern_index;
  }
  else if(pattern_index==0)
  {
  ++target_index;
  }
  else
  {
  pattern_index=overlay_value[pattern_index-1]+1;
  }
  }
  if(pattern_index==pattern_length)
  {
  return target_index-pattern_index;
  }
  else
  {
  return-1;
  }
  }
  public static void compute_overlay(string pattern)
  {
  int pattern_length=pattern.Length;
  int[]overlay_function=new int[pattern_length];
  int index;
  overlay_function[0]=-1;
  for(int i=1;i<pattern_length;++i)
  {
  index=overlay_function[i-1];
  while(index>=0&&pattern[i]!=pattern[index+1])
  {
  index=overlay_function[index];
  }
  if(pattern[i]==pattern[index+1])
  {
  overlay_function[i]=index+1;
  }
  else
  {
  overlay_function[i]=-1;
  }
  }
  for(int i=0;i<pattern_length;++i)
  {
  Console.Write(overlay_function[i]+" ");
  }
  Console.ReadKey();
}

via

经典.NET面试题 C# ASP.NET面试题 (一)

365据说看到好文章不转的人,服务器容易宕机
原创文章如转载,请注明:转载自郑州网建-前端开发 http://camnpr.com/
本文链接:http://camnpr.com/archives/net-topic-interview2.html