NET面试题 (四)

1, 面向对象的思想主要包括什么?javascript

封装、继承、多态。html

TLWjava

封装:用抽象的数据类型将数据和基于数据的操做封装在一块儿,数据被保护在抽象数据类型内部。mysql

继承:子类拥有父类的全部数据和操做。程序员

多态:一个程序中同名的不一样方法共存的状况。web

 

封装:封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,而且类能够把本身的数据和方法只让可信的类或者对象操做,对不可信的进行信息隐藏正则表达式

继承:继承是指这样一种能力:它可使用现有类的全部功能,并在无需从新编写原来的类的状况下对这些功能进行扩展。算法

多态:经过继承实现的不一样对象调用相同的方法,表现出不一样的行为,称之为多态。sql

2, 进程和线程的区别?数据库

TLW

进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程能够有多个线程,这些线程共享这个进程的资源。

启动一个线程是用run()仍是start()?

     启动一个线程是调用start()方法,使线程所表明的虚拟处理机处于可运行状态,这意味着它能够由JVM调度并执行。这并不意味着线程就会当即运行。run()方法能够产生必须退出的标志来中止一个线程。

 

区别:

一个程序至少有一个进程,一个进程至少有一个线程;

线程的划分尺度小于进程,使得多线程程序的并发性高;

进程在执行过程当中拥有独立的内存单元, 而多个线程共享内存;每一个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,可是线程不能独立运行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

3, 堆和栈的区别?

TLW

栈:由编译器自动分配、释放。在函数体中定义的变量一般在栈上。

堆:通常由程序员分配释放。用new、malloc等分配内存函数分配获得的就是在堆上。

 

堆栈空间分配区别

栈(操做系统):由操做系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操做方式相似于数据结构中的栈;

堆(操做系统): 通常由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式却是相似于链表。

堆栈缓存方式区别:

(1) 栈使用的是一级缓存, 他们一般都是被调用时处于存储空间中,调用完毕当即释放;

(2) 堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并非一旦成为孤儿对象就能被回收)。因此调用这些对象的速度要相对来得低一些。

堆栈数据结构区别:

堆(数据结构):堆能够被当作是一棵树,如:堆排序;

栈(数据结构):一种先进后出的数据结构。

4, 概述o/r mapping的原理O/R Mapping全称Object Relational Mapping,就是对象关系映射。

利用反射,配置 将类于数据库表映射。

5, abstract class(抽象类)和interface(接口)有什么区别?他们的相同点是什么?接口的应用场合是什么?

区别:

A. interface须要实现,要用implements,而abstract class须要继承,要用extends。 
B. 一个类能够实现多个interface,但一个类只能继承一个abstract class。 
C. interface强调特定功能的实现,而abstract class强调所属关系。 
D. 尽管interface实现类及abstrct class的子类都必需要实现相应的抽象方法,但实现的形式不一样。interface中的每个方法都是抽象方法,都只是声明的(declaration,没有方法体),实现类必需要实现。而abstract class的子类能够有选择地实现。 
这个选择有两点含义: 
    一是Abastract class中并不是全部的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子类必须实现。那些没有abstract的方法,在Abstrct class中必须定义方法体。 
    二是abstract class的子类在继承它时,对非抽象方法既能够直接继承,也能够覆盖(重写);而对抽象方法,能够选择实现,也能够经过再次声明其方法为抽象的方式,无需实现,留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,固然也不能实例化。 
E. abstract class是interface与Class的中介。 
interface是彻底抽象的,只能声明方法,并且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也不能声明实例变量。然而,interface却能够声明常量变量。但将常量变量放在interface中违背了其做为接口的做用而存在的宗旨,也混淆了interface与类的不一样价值。若是的确须要,能够将其放在相应的abstract class或Class中。 abstract class在interface及Class中起到了承上启下的做用。一方面,abstract class是抽象的,能够声明抽象方法,以规范子类必须实现的功能;另外一方面,它又能够定义缺省的方法体,供子类直接使用或覆盖(重写)。另外,它还能够定义本身的实例变量,以供子类经过继承来使用。

相同点:

A. 二者都是抽象类,都不能实例化。 
B. interface实现类及abstrct class的子类都必需要实现已经声明的抽象方法。

Interface的应用场合:

A. 类与类以前须要特定的接口进行协调,而不在意其如何实现。 
B. 做为可以实现特定功能的标识存在,也能够是什么接口方法都没有的纯粹标识。 
C. 须要将一组类视为单一的。

接口是否能够继承接口?抽象类是否能够实现接口?抽象类是否能够继承实体类?

   接口是能够继承接口的,抽象类是能够实现接口的,抽象类能够继承实体类,但前提条件是实体类必需要有明确的构造函数。

6, ADO.NET中读写数据库中须要用到哪些类?他们的做用?

Connection:链接对象。
Command: 命令对象,指示要执行的命令和存储过程。
DataReader:是一个向前的只读的数据流。
DataAdapter:是功能强大的适配合器,支持增删改查的功能。
DataSet:是一个数据级对象,至关于内存中的一张表或多张表。

DataTable 用来存储一个表的数据.

7, 重写(override)和重载(overload)的区别。

TLW

重载是方法的名称相同。参数或参数类型不一样,进行屡次重载以适应不一样的须要

重写是进行基类中函数的重写。为了适应须要

 

(1)重写必须继承,重载不用。
(2)重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不一样。
(3)重写的方法修饰符大于等于父类的方法,重载和修饰符无关。
(4)重写不能够抛出父类没有抛出的通常异常,能够抛出运行时异常

8, GC是什么?为何要有GC?

TLW

GC是垃圾收集器(垃圾回收机制)。程序员不用担忧内存管理,由于垃圾收集器会自动进行管理。要请求垃圾收集,能够调用下面的方法之一:

 System.gc();

Runtime.getRuntime().gc();

C#是否能够对内存直接进行操做?

  C#是能够对内存进行直接操做的,虽然不多用到指针,可是C#是可使用指针的,在用的时候须要在前边加unsafe,.net中使用了垃圾回收机制(GC)功能,它替代了程序员,不过在C#中不能够直接使用finalize方法,而是在析构函数中调用基类的finalize()方法。

 

GC:垃圾回收机制。

使用GC的缘由(好处):

(1)提升了软件开发的抽象度;

(2)程序员能够将精力集中在实际的问题上而不用分心来管理内存的问题;

(3)可使模块的接口更加的清晰,减少模块间的偶合;

(4)大大减小了内存人为管理不当所带来的Bug;

(5)使内存管理更加高效。

GC的使用示例:

GC.SuppressFinalize(this);//设置对象的阻止终结器代码

GC.SuppressFinalize(this)的做用:实现IDisposable接口的对象能够从IDisposable.Dispose方法调用此方法(GC.SuppressFinalize(this)),以防止垃圾回收器对不须要终止的对象调用Object.Finalize。

GC的方法:

Collect()

强制对全部代进行即时垃圾回收。

Collect(Int32)

强制对零代到指定代进行即时垃圾回收。

Collect(Int32, GCCollectionMode)

强制在 GCCollectionMode 值所指定的时间对零代到指定代进行垃圾回收。


10,什么叫作应用程序域?

    应用程序域能够理解为一种轻量级进程。起到安全的做用。占用资源小。

    TLW

    应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域一般由运行库宿主建立,运行库宿主负责在运行应用程序以前引导公共语言运行库。应用程序域提供了一个更安全、用途更广的处理单元,公共语言运行库可以使用该单元提供应用程序之间的隔离

 

应用程序域 (application domain) (AppDomain) ,一种边界,它由公共语言运行库围绕同一应用程序范围内建立的对象创建(即,从应用程序入口点开始,沿着对象激活的序列的任何位置)。应用程序域有助于将在一个应用程序中建立的对象与在其余应用程序中建立的对象隔离,以使运行时行为能够预知。在一个单独的进程中能够存在多个应用程序域。

11,列举ASP.NET页面之间传递值的几种方式。

使用QueryString变量 、使用Application对象变量 、使用Session变量 、使用Cookie对象变量 、使用Server.Transfer方法 、URL传参、使用cache。

12,概述反射和序列化(映射)。
TLW
反射:
公共语言运行库加载器管理应用程序域。这种管理包括将每一个程序集加载到相应的应用程序域以及控制每一个程序集中类型层次结构的内存布局。程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可使用反射动态地建立类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。而后,能够调用类型的方法或访问其字段和属性。
序列化:序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,能够轻松地存储和传输数据。


反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可使用反射动态地建立类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。而后,能够调用类型的方法或访问其字段和属性
序列化:序列化是将对象转换为容易传输的格式的过程。例如,能够序列化一个对象,而后使用 HTTP 经过 Internet 在客户端和服务器之间传输该对象。在另外一端,反序列化将从该流从新构造对象。

13,概述.NET里对remoting和webservice两项技术的理解和实际中的应用。
webservice远程逻辑调用,remoing接口只能用在.net中。
.net remoting的工做原理:
 服务器端向客户端发送一个进程编号,一个程序域编号,以肯定对象的位置。

13,值类型和引用类型的区别和相同点。
    TLW

(1)基于值类型的变量直接包含值。将一个值类型变量赋给另外一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不一样,引用类型变量的赋值只复制对对象的引用,而不复制对象自己。

(2)全部的值类型均隐式派生自 System.ValueType。与引用类型不一样,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也能够实现接口。

(3)与引用类型不一样,值类型不可能包含 null 值。然而,可空类型功能容许将null 赋给值类型。 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。

(4)值类型主要由两类组成:结构、枚举; 结构分为如下几类:Numeric(数值)类型、整型、浮点型、decimal、bool、用户定义的结构。

(5)引用类型的变量又称为对象,可存储对实际数据的引用。声明引用类型的关键字:class、interface、delegate、内置引用类型: object、string。

 

 

值类型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。值类型变量声明后,无论是否已经赋值,编译器为其分配内存。

引用类型(reference type):string 和 class统称为引用类型。当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并无为其分配堆上的内存空间。当使用 new 建立一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。
相同点:

引用类型能够实现接口,值类型当中的结构体也能够实现接口;

引用类型和值类型都继承自System.Object类。

区别:

    1)范围方面
C#的值类型包括:结构体(数值类型、bool型、用户定义的结构体),枚举,可空类型。
C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。

2)内存分配方面:

数组的元素无论是引用类型仍是值类型,都存储在托管堆上。

引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。简称引用类型部署在托管推上。而值类型老是分配在它声明的地方:做为字段时,跟随其所属的变量(实 例)存储;做为局部变量时,存储在栈上。(栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放)

3)适用场合

值类型在内存管理方面具备更好的效率,而且不支持多态,适合用作存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。

14,out参数和ref参数有什么区别?

        ref和out都是C#中的关键字,所实现的功能也差很少,都是指定一个参数按照引用传递

     区别:

(1)   ref传进去的参数必须在调用前初始化,out没必要;

(2)   ref传进去的参数在函数内部能够直接使用,而out不可;

(3)   ref传进去的参数在函数内部能够不被修改,但out必须在离开函数体前进行赋值;

(4)   系统对ref的限制是更少一些的。

15,ExecuteNonQuery方法和ExecuteScalar方法的区别
    ExecuteNonQuery()执行命令对象的SQL语句,返回一个int类型变量,若是SQL语  句是对数据库的记录进行操做(如记录的增长、删除和更新),那么方法将返回操做所影响的记录条数。
    ExecuteScalar()执行命令对象的SQL语句,若是SQL语句是SELECT查询,则仅仅返回查询结果集中的第1行第1列,而忽略其余的行 和列。该方法所返回的结果为object类型,在使用以前必须强制转换为所需的类型。若是SQL语句不是SELECT查询,则返回结果没有任何做用。

15,UDP链接和TCP链接的异同。

前者只管传,无论数据到不到,无须创建链接。后者保证传输的数据准确,需要连结。

16,ASP.NET的身份验证方式有哪些?

form认证,windows集成认证等。

17,什么是code-Behind技术?有什么好处?

定义:Code Behind就是所谓的代码分离。在.NET中,通常是用两种文件来建立一个ASP.NET页面,(1)页面文件,通常以.aspx或.ascx为扩展名,(2)程序代码文件,通常以.cs或.cb为扩展名。

好处:界面设计和程序代码的分开,对于代码的重用、程序调试和维护都是革命性的,特别是在.NET中面向对象方式的应用。

18,Session有什么重大bug?微软提出了什么解决办法?
    是iis中因为有进程回收机制,系统繁忙的话Session会丢失,能够用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,并且没法捕获Session的END事件。
19,this关键字的涵义。
this 关键字引用类的当前实例,还可用做扩展方法的第一个参数的修饰符。
20,大概描述一下ASP.NET服务器控件的生命周期
初始化->加载视图状态->处理回发数据->加载->发送回发更改通知->处理回发事件
->预呈现->保存状态->呈现->处置->卸载

21,大概描述asp.net 页面生命周期
   请求页面->开始->初始化页面->加载页面->验证->回发事件处理

->呈现页面->卸载页面

    请求页面:页请求发生在页生命周期开始以前。

开始:在开始阶段,将设置页属性,如Request和Response。在此阶段,页还将肯定请求是回发请求仍是新请求,并设置IsPostBack属性。

初始化页面:页面初始化期间,可使用页中的控件,并将设置每一个控件的UniqueID属性。若是当前请求是回发请求,则回发数据还没有加载,而且控件属性值还没有还原为视图状态中的值。

加载页面:加载期间,若是当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。

验证:在验证期间,将调用全部验证程序控件的Validate方法,此方法将设置各个验证程序控件和页的IsValid属性。

回发事件处理:若是请求是回发请求,则将调用全部事件处理程序。

呈现页面:在页面呈现期间,视图状态将被保存到页面,而后页面将调用每一个控件,以将其呈现的输出提供给页的Response属性的OutputStream。

卸载页面:彻底呈现页、将页发送至客户端并准备丢弃时,将调用卸载。此时,将卸载页属性(如Response和Request)并执行清理。

22,请说出public/private/protect/internal的访问权限。

    private : 私有成员, 在类的内部才能够访问。
protected : 保护成员,该类内部和继承类中能够访问。
public : 公共成员,彻底公开,没有访问限制。
internal: 在同一命名空间内能够访问。

23,概述三层架构每一层的含义和各层之间的依赖关系以及各层的做用?三层的优缺点。和MVC的区别。

    展现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。

    依赖关系:业务逻辑层(BLL)引用数据访问层(DAL),展现层(UI)引用业务逻辑层(BLL)。Model贯穿全部层,全部的层都引用它。

    各层的做用:

数据访问层:主要是对非原始数据(数据库或者文本文件等存放数据的形式)的操做层,而不是指原始数据,也就是说,是对数据库的操做,而不是数据,具体为业务逻辑层或表示层提供数据服务.

业务逻辑层:主要是针对具体的问题的操做,也能够理解成对数据层的操做,对数据业务逻辑处理,若是说数据层是积木,那逻辑层就是对这些积木的搭建。

界面层:主要表示WEB方式,也能够表示成WINFORM方式,WEB方式也能够表现成:aspx,若是逻辑层至关强大和完善,不管表现层如何定义和更改,逻辑层都能完善地提供服务。

使用三层的优势(好处):

(1)开发人员能够只关注整个结构中的其中某一层;

(2)能够很容易的用新的实现来替换原有层次的实现;

(3)能够下降层与层之间的依赖;

(4)有利于标准化;

(5)利于各层逻辑的复用;

(6)结构更加的明确;

(7)在后期维护的时候,极大地下降了维护成本和维护时间。

使用三层的缺点:

(1)下降了系统的性能。这是不言而喻的。若是不采用分层式结构,不少业务能够直接造访数据库,以此获取相应的数据,现在却必须经过中间层来完成。

(2)有时会致使级联的修改。这种修改尤为体如今自上而下的方向。若是在表示层中须要增长一个功能,为保证其设计符合分层式结构,可能须要在相应的业务逻辑层和数据访问层中都增长相应的代码。

(3)增长了开发成本。

MVC:

View(视图)显示数据(数据库记录)

Controller(控制器)处理输入(写入数据库记录)

Model(模型)表示应用程序核心(好比数据库记录列表)

 

和MVC的区别:

  MVC(模型Model-视图View-控制器Controller)是一种架构模式,能够用它来建立在域对象和UI表示层对象之间的区分。

一样是架构级别的,相同的地方在于他们都有一个表现层,可是他们不一样的地方在于其余的两个层。

在三层架构中没有定义Controller的概念。这是最不一样的地方。而MVC也没有把业务的逻辑访问当作两个层,这是采用三层架构或MVC搭建程序最主要的区别。固然了。在三层中也提到了Model,可是三层架构中Model的概念与MVC中Model的概念是不同的,“三层”中典型的Model层是以实体类构成的,而MVC里,则是由业务逻辑与访问数据组成的。

24,批量插入数据的实现方式。
 (1)使用SqlBulkCopy;

private void SqlBulkCopyByDatatable(string connectionString, string TableName, DataTable dt)
{
   using (SqlConnection conn = new SqlConnection(connectionString))
   {
      using (SqlBulkCopy sqlbulkcopy =new SqlBulkCopy(connectionString, SqlBulk  CopyOptions.UseInternalTransaction))
      {
         try
         {
           sqlbulkcopy.DestinationTableName = TableName;
           for (int i = 0; i < dt.Columns.Count; i++)
           {
               sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
           }
               sqlbulkcopy.WriteToServer(dt);
         }
         catch (System.Exception ex)
         {
             throw ex;
         }
       }
     }
   }

(2)使用.net ODP特性
      //设置一个数据库的链接串
      string connectStr = "User Id=scott;Password=tiger;Data Source=";
      OracleConnection conn = new OracleConnection(connectStr);
      OracleCommand command = new OracleCommand();
      command.Connection = conn;
      //这个参数须要指定每次批插入的记录数
      command.ArrayBindCount = recc;
      //在这个命令行中,用到了参数,参数咱们很熟悉,可是这个参数在传值的时候
      //用到的是数组,而不是单个的值,这就是它独特的地方
      command.CommandText

= "insert into dept values(:deptno, :deptname, :loc)";
      conn.Open();
      //下面定义几个数组,分别表示三个字段,数组的长度由参数直接给出
      int[] deptNo = new int[recc];
      string[] dname = new string[recc];
      string[] loc = new string[recc];
      // 为了传递参数,不可避免的要使用参数,下面会连续定义三个
      OracleParameter deptNoParam

= new OracleParameter("deptno", OracleDbType.Int32);
deptNoParam.Direction = ParameterDirection.Input;
deptNoParam.Value = deptNo; command.Parameters.Add(deptNoParam);
OracleParameter deptNameParam = new OracleParameter("deptname", OracleDbType.Varchar2);
deptNameParam.Direction = ParameterDirection.Input;
deptNameParam.Value = dname; command.Parameters.Add(deptNameParam);
OracleParameter deptLocParam = new OracleParameter("loc", OracleDbType.Varchar2);
deptLocParam.Direction = ParameterDirection.Input;
deptLocParam.Value = loc;
command.Parameters.Add(deptLocParam);
Stopwatch sw = new Stopwatch();

sw.Start();
//在下面的循环中,先把数组定义好,而不是像上面那样直接生成SQL
for (int i = 0; i < recc; i++)
{
    deptNo[i] = i;

dname[i] = i.ToString();

loc[i] = i.ToString();
}
//这个调用将把参数数组传进SQL,同时写入数据库
command.ExecuteNonQuery();
sw.Stop();
System.Diagnostics.Debug.WriteLine("批量插入:" + recc.ToString() + "所占时间:" +sw.ElapsedMilliseconds.ToString());

25,如何处理几十万条并发数据?

    TLW:
存储过程事务。取得最大标识的时候同时更新,注意主键不是自增量方式,这种方法并发的时候是不会有重复主键的,取得最大标识要有一个存储过程来获取.
  

(1)HTML静态化 (2)图片服务器分离 (3)数据库集群和库表散列 (4)缓存 
   (5)镜像 (6)负载均衡

26,查询效率的优化。

合理使用索引、表分区、避免或简化排序、消除对大型表行数据的顺序存取、避免相关子查询、使用临时表加速查询

 

避免使用select *、存储过程、合理使用索引、避免相关子查询、使用临时表加速、避免困难的正则表达式。

存储过程过多不利于数据库的迁移。

27, SQL防注入。

SQL注入:利用sql关键字对网站进行攻击。
    (1)值参数化;(2)过滤禁止运行;(3)使用存储过程。

28,简述事务的概念。
事务是用户定义的一个数据库操做序列,这些操做要么全作要么全不作,是一个不可分割的工做单位。
事务具备四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)

29,委托、事件和观察者模式(Observer模式)。

    TLW:

    委托是一种安全的相似与函数指针,可是她比指针要安全的多,它能够把方法做为一个参数传递给另外一个方法,能够理解为指向函数的引用。

事件是一种消息机制,它是一种委托,委托不带方法体。

 

C#中的委托是什么?事件是否是一种委托?

委托能够把一个方法做为参数代入另外一个方法。委托能够理解为指向一个函数的引用。事件是一种特殊的委托



       委托是一个类,它定义了方法的类型,使得能够将方法看成另外一个方法的参数来进行传递,这种将方法动态地赋给参数的作法,能够避免在程序中大量使用If-Else(Switch)语句,同时使得程序具备更好的可扩展性。

       使用委托能够将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是由于此变量表明一个方法),能够依次调用全部绑定的方法。
   事件封装了委托类型的变量,使得:在类的内部,无论你声明它是public仍是protected,它老是private 的。在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。

   观察者模式:

适用性:

在如下任一状况下可使用观察者模式:
• 当一个抽象模型有两个方面, 其中一个方面依赖于另外一方面。将这两者封装在独立的对象中以使它们能够各自独立地改变和复用。
• 当对一个对象的改变须要同时改变其它对象 , 而不知道具体有多少对象有待改变。
• 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之 , 你不但愿这些对象是紧密耦合的。
对象:
Observer设计模式中主要包括以下两类对象:

(1)Subject:监视对象,它每每包含着其余对象所感兴趣的内容。

(2)Observer:监视者,它监视Subject,当Subject中的某件事发生的时候,会告知Observer,而Observer则会采起相应的行动。

30,适配器模式(Adepter)的定义与适用场景。

    定义:适配器模式将某个类的接口转换成客户端指望的另外一个接口表示,主的目的是兼容性,让本来因接口不匹配不能一块儿工做的两个类能够协同工做。其别名为包装器(Wrapper)。
三种适配器:
类适配器,以类给到,在Adapter里,就是将src当作类,继承,
对象适配器,以对象给到,在Adapter里,将src做为一个对象,持有。
接口适配器,以接口给到,在Adapter里,将src做为一个接口,实现。
适用场景:

(1)系统须要使用现有的类,而这些类的接口不符合系统的接口。

(2)想要创建一个能够重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在未来引进的类一块儿工做。

(3)两个类所作的事情相同或类似,可是具备不一样接口的时候。

(4)旧的系统开发的类已经实现了一些功能,可是客户端却只能以另外接口的形式访问,但咱们不但愿手动更改原有类的时候。

(5)使用第三方组件,组件接口定义和本身定义的不一样,不但愿修改本身的接口,可是要使用第三方组件接口的功能。

     适配器应用举例:

    使用过ADO.NET的开发人员应该都用过DataAdapter,它就是用做DataSet和数据源之间的适配器。DataAdapter经过映射Fill和Update来提供这一适配器。

31,单例模式的定义、特色与适用场景。

     定义:单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,由于设计模式讲究对象之间的关系的抽象,而单例模式只有本身一个对象,也所以有些设计大师并把把其称为设计模式之一。

适用场景:

单例模式应用的场景通常发如今如下条件下:

(1)资源共享的状况下,避免因为资源操做时致使的性能或损耗等。如上述中的日志文件,应用配置。

(2)控制资源的状况下,方便资源之间的互相通讯。如线程池等。
    单例模式三要点:
   
单例模式有三个要点:

一是某个类只能有一个实例;

二是它必须自行建立这个实例;   

三是它必须自行向整个系统提供这个实例。

    Public class LoadBalancer

{

           //私有静态成员变量,存储惟一实例

            private  static LoadBalancer instance = null;

           //私有构造函数

            private  LoadBalancer()

            {

                   serverList  = new ArrayList();

            }

            //公有静态成员方法,返回惟一实例

            public  static LoadBalancer getLoadBalancer()

            {

                   if  (instance == null)

                   {

                          instance  = new LoadBalancer();

                   }

                    return  instance;

             }

      饿汉式单例类:

      public class EagerSingleton

{

  //因为在定义静态变量的时候实例化单例类,所以在类加载的时候就已经建立了//单例对象

private static final  EagerSingleton instance = new EagerSingleton();

private EagerSingleton() { }

public static EagerSingleton getInstance()

{

return instance;

}

}

懒汉式单例类:

public class LazySingleton

{

private static LazySingleton instance = null;

private LazySingleton() { }

//在getInstance()方法前面增长了关键字synchronized进行线程锁,以处理//多个线程同时访问的问题

synchronized public  static LazySingleton getInstance()

{

if (instance == null)

{

instance = new  LazySingleton();

                    }

return instance;

}

}

32,CTS、CLS、CLR分别做何解释?

CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。

33,请简述单元测试的做用和其优势。

(1)帮助开发人员编写代码,提高质量、减小bug。

(2)提高反馈速度,减小重复工做,提升开发效率。

(3)保证你最后的代码修改不会破坏以前代码的功能。

(4)让代码维护更容易。

(5)有助于改进代码质量和设计。

34,C#中String 和 string 有什么区别?

没有任何区别,string  只是 String 的别名。

35,请你说说.NET中类和结构的区别?

    Class能够被实例化,属于引用类型,class能够实现接口和单继承其余类,还能够做为基类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的。

36,死锁的必要条件?怎么克服?

      系统的资源不足,进程的推动的顺序不合适,资源分配不当,一个资源每次只能被一个进程使用,一个进程请求资源时,而此时这个资源已阻塞,对已得到资源不放,进程得到资源时,未使用完前,不能强行剥夺。

37,构造器Constructor是否能够被继承?是否能够被Override?

Constructor不能够被继承,所以不能被重写(Overriding),但能够被重载(Overloading)。

38,当一个线程进入一个对象的方法后,其它线程是否能够进入该对象的方法?

不能够,一个对象的方法只能由一个线程访问。

39,Error和Exception有什么区别?

    error表示恢复不是不可能,可是很困难,exception表示一种实际或实现问题,它表示程序运行正常不能够发生的。

40,谈谈final,finally,finallize的区别?

  final用于申明属性,方法和类,表示属性不可变,方法不能够被覆盖,类不能够被继承。

  Finally是异常处理语句结构中,表示老是执行的部分。

  Finallize表示是object类一个方法,在垃圾回收机制中执行的时候会被调用被回收对象的方法。

41,HashMap和Hashtable区别?

    HashMap是Hashtable的轻量级实现,非线程安全的,他们都实现了map接口,主要区别是HashMap键值能够为空null,效率能够高于Hashtable。

42,Collection和Collections的区别?

    Collection是集合类的上级接口,Collections是针对集合类的一个帮助类,它提供一系列静态方法来实现对各类集合的搜索,排序,线程安全化操做。

43,New有几种用法?

  有3种。

第一种是,实例化如:New Class();

第二种是,public new 隐藏基类的方法

  第三种是,在泛型类申明中的任何类型参数都必须有公共的无参构造函数。

44,Const和ReadOnly?

   Const用来申明编程时常量,const字段只能在该字段的声明中初始化。const默认是静态的。

ReadOnly用来申明运行时常量。readonly字段能够在声明或构造函数中初始化,根据不一样的构造函数,readonly能够有不一样的值。readonly设置为静态,是必须先声明的。

45,UDP和TCP链接有和异同?

        TCP是传输控制协议,提供的是面向链接的,是可靠的,字节流服务,当用户和服务器彼此进行数据交互的时候,必须在他们数据交互前要进行TCP链接以后才能传输数据。TCP提供超时重拨,检验数据功能。UDP是用户数据报协议,是一个简单的面向数据报的传输协议,是不可靠的链接。

46,什么是强命名程序集?

        程序集须要通过加密签名,强命名程序集能够部署到全局程序集缓存中,成为公共程序集。

47,简述WebService、WCF。

    Webservice相关的:

    概念:

Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可以使用开放的XML标准通用标记语言下的一个子集)标准描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操做的应用程序

以默认工程详解:

    namespace WebService1

{

       /// <summary>

       /// Service1 的摘要说明

       /// </summary>

      [WebService(Namespace = "http://tempuri.org/")]

       //用于向 XML Web services 添加附加信息,如描述其功能的字符串。

//对于将要发布和执行的 XML Web services 来讲,

//WebServiceAttribute 不是必需的。

//可使用 WebServiceAttribute 为 XML Web services 指定

//不受公共语言运行库标识符(用于 XML Web services 的“服务说明”和

//“服务帮助”页)规则限制的名称。

      //XML Web services 在成为公共以前,应该更改其默认的 XML 命名空间。

//每一个 XML Web services 都须要惟一的 XML 命名空间来标识它,

//以便客户端应用程序可以将它与网络上的其余服务区分开来。

//http://tempuri.org/ 可用于正在开发中的 XML Web services,

//可是已发布的 XML Web services 应该使用更具永久性的命名空间。

//例如,能够将公司的 Internet 域名做为 XML 命名空间的一部分。

//虽然不少 XML Web services 的 XML 命名空间与 URL 很类似,可是,

//它们无需指向 Web 上的某一实际资源。(XML Web services 的 XML 命名空间

//是 URI。)对于使用 ASP.NET 建立的 XML Web services,

//可使用 Namespace 属性更改默认的 XML 命名空间。

 

    //ConformsTo  获取或设置绑定声称所符合的 Web 服务互操做性 (WSI) 规范。

      [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 

      //声明定义一个或多个 XML Web services 方法的绑定。没法继承此类。

//按 Web 服务描述语言 (WSDL) 的定义,绑定相似于一个接口,

//缘由是它定义一组具体的操做。

//每一个 XML Web services 方法都是特定绑定中的一项操做。

//XML Web services 方法是 XML Web services 的默认绑定的成员,

//或者是在应用于实现 XML Web services 的类的 WebServiceBindingAttribute

//中指定的绑定的成员。

//XML Web services 能够经过将多个 WebServiceBindingAttribute 属性

//应用于 XML Web services 来实现多个绑定。

//将一个或多个 WebServiceAttribute 属性应用到 XML Web services 以后,

//能够将 SoapDocumentMethodAttribute 或 SoapRpcMethodAttribute

//应用到各个 XML Web services 方法

//以指示由特定的 XML Web services 方法实现的绑定操做。

//设置 SoapDocumentMethodAttribute 或 SoapRpcMethodAttribute 的

//Binding 属性以指定 XML Web services 方法正在为其实现操做的绑定。

 

      [System.ComponentModel.ToolboxItem(false)]//提供工具箱项的基实现。

      // 若要容许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。

      // [System.Web.Script.Services.ScriptService]

      public class Service1 : System.Web.Services.WebService

//表示此网站项目实现的一个 Web 服务,如同将此网站引用添加到项目时

//以 Visual Studio 生成的 .asmx 文件表示同样。

      {

         [WebMethod]

//向使用 ASP.NET 建立的 XML Web services 中的某个方法添加

//此属性 (Attribute) 后,就能够从远程 Web 客户端调用该方法。没法继承此类。

//初始化 WebMethodAttribute 类的新实例。

          public string HelloWorld()

          {

               return "Hello World";

          }

     }

}

    WCF相关的:

概念:

WCF 就是针对繁杂却又切实存在的状况而设计的,是公开和访问服务的 Windows应用程序的首选技术。

WCF就是专门用于服务定制、发布与运行以及消息传递和处理的一组专门类的集合,也就是所谓的“类库”。

将DCOM、Remoting、Web Service、WSE、MSMQ集成在一块儿,从而下降了分布式系统开发者的学习曲线,并统一了开发标准。

承载方式:

(1)经过IIS中承载

   与web网站发布方式一致。

(2)经过Windows进程激活服务(WAS)中承载  

   容许经过HTTP以外的协议进行激活和网络通讯。可支持任何网络协议(包括HTTP、net.tcp、net.pipe和net.msmq)进行通讯的WCF服务。

(3)经过托管应用程序中承载(自承载)

三种消息模式:

(1)请求与答复(默认)

   请求发送方(客户端应用程序)将接收与请求相关的答复。

(2)单向/工

   若是WCF服务应用程序的客户端没必要等待操做完成,而且不处理SOAP错误,则该操做能够指定为单向消息模式。
       [OperationContract(IsOneWay=true)]

void Hello(string greeting);

 

(3)双工

      特色:不管使用单向消息发送仍是请求/答复消息发送方式,服务和客户端均可以独立地向对方发送消息。

      要设计双工协定,必须有回调协定,并将该回调协定的类型分配给标记服务契约的ServiceContract属性的CallbackContract属性。
配置服务:

 

  (1)Service元素的一些属性值:

   Name:指定提供服务协定的实现的类型。彻底限定名称(命名空间和类型名称)。

   behaviorConfiguration:指定一个在behaviors元素中找到的behavior元素的名称。

<service name= “WcfServiceLibrary1.Service1"

behaviorConfiguration= " WcfServiceLibrary1.Service1Behavior"> 

    (2)endpoint元素的一些属性值:

     address:是URL。能够是绝对地址或相对服务基址给定的地址(可为空)。

     binding:系统提供的绑定方式,指定的绑定肯定传输协议类型、安全和使用的编码,以及是否支持或启用可靠会话、事务或流。

     bindingConfiguration:给定binding元素的name值。

     contract:指定定义协定的接口。

    

    <endpoint

address="" binding="wsHttpBinding" contract="Tlw.Contract.Service.IDemoWCF">

</endpoint>

WCF三大契约:

服务契约

    描述了暴露给外部的类型(接口或类)、服务所支持的操做、使用的消息交换模式和消息格式。一个WCF服务必须实现至少一个服务契约,包括两种:ServiceContract和OperationContract;ServiceContract用于类或者结构上,用于指示WCF此类或者结构可以被远程调用,而OperationContract用于类中的方法(Method)上,用于指示WCF该   方法可被远程调用。

数据契约

数据契约须要引用System.Runtime.Serialization命名空间,

包括两种:DataContract和DataMember;

属性值:

Name:数据契约名称

NameSpace:命名空间

IsRequired:指示该成员序列化前必须被赋值Order:数据项排列规则

消息契约

      消息契约关注数据成员在SOAP消息中的表示,包括3种:MessageContract、 MessageHeader、MessageBodyMember;

属性值:

    Name:契约名称

    NameSpace:命名空间

    ProtectionLevel:表示保护级别

    Order:数据项排列规则

48,什么是Web Service?UDDI?

        Web Service即是基于网络的、分布式的模块化组件,它执行特定的任务,遵照具体的技术规范,这些规范使得Web Service能与其余兼容的组件进行互操做。UDDI 的目的是为电子商务创建标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业可以发现的访问协议的实现标准。

49,解释一下UDDI、WSDL的意义及其做用?

      UDDI是统一描述集成协议,是一套基于Web的,分布式的,为WEB服务提供的信息注册的实现标准规范,同时也是为企业自己提供的Web服务注册以让别的企业可以发现并访问的协议标准。提供了基于标准的规范,用于描述和发现服务,还提供了一组基于因特网的实现。

WSDL这是一个基于XML的描述WEB服务的接口。

50,什么是SOAP?

      是简单访问协议。是在分布式环境中,交换信息并实现远程调用的协议。是一个基于XML的协议。使用SOAP,能够不考虑任何传输协议,但一般仍是HTTP协议,能够容许任何类型的对象或代码,在任何平台上,以任一种语言相互通讯。它是一种轻量级协议

51,在.NET中全部类的基类是?

  object。

52,能用foreach遍历访问的对象须要实现?

  须要实现IEnumerable接口和GetEnumerator ()方法。

53,Heap与stack的差异?

  Heap是堆,通常由程序员分配释放,它的存储区很大的自由存储区。

  Stack是栈,是由是操做系统自动分配和释放的,栈上的空间是有限的。程序在编译期间变量和函数分配内存都是在栈上进行的,且在运行时函数调用时的参数的传递也是在栈上进行的。

54,在.net中,配件的意思是?

    程序集。(中间语言,源数据,资源,装配清单)。

55,经常使用的调用WebService的方法有哪些?

    1.使用WSDL.exe命令行工具。2.使用VS.NET中的Add Web Reference菜单选项。

56,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

    不能,一个对象的一个synchronized方法只能由一个线程访问。

67,sleep() 和 wait() 有什么区别?

    sleep()方法是使线程中止一段时间的方法。在sleep 时间间隔期满后,线程不必定当即恢复执行。这是由于在那个时刻,其它线程可能正在运行并且没有被调度为放弃执行,除非(a)“醒来”的线程具备更高的优先级(b)正在运行的线程由于其它缘由而塞。wait()是线程交互时,若是线程对一个同步对象x 发出一个wait()调用,该线程 会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

68,成员变量和成员函数前加static的做用?

    称为类(常)成员变量和类(常)成员函数。分别用来反映类的状态。好比类成员变量能够用来统计类实例的数量,类成员函数负责这种统计的动做。

69,请指出GAC的含义?

    全局程序集缓存。

60,向服务器发送请求有几种方式?

    get,post。
get通常为连接方式,post通常为按钮方式。

61,DataReader与Dataset有什么区别?

    一个是只能向前的只读游标,一个是内存中的表。

62,须要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,若是字符串中间还有连续空格的话,仅保留一个空格,即容许字符串中间有多个空格,但连续的空格数不可超过一个.

    string inputStr=" xx xx ";

    inputStr=Regex.Replace(inputStr.Trim()," *"," ");

63,用sealed修饰的类有什么特色?

    密封,不能继承。

64,在.Net中全部可序列化的类都被标记为_____?

    [serializable]

65,<%# %> 和 <%  %> 有什么区别?

<%# %>表示绑定的数据源;<% %>是服务器端代码块。

66,&和&&的区别。

&是位运算符,表示按位与运算;&&是逻辑运算符,表示逻辑与(and)。

67,email正则表达式 (5)

/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;

/^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/;

/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/;

68,javascript是面向对象的,怎么体现javascript的继承关系,怎样实现?

    function Circle(r) {

      this.r = r;

}

Circle.PI = 3.14159;

Circle.prototype.area = function()

{

       return Circle.PI * this.r * this.r;

}

var c = new Circle(1.0);  

alert(c.area());

 

数据库相关:

1,数据库设计六大范式。
   主要有六种范式:

第一范式原子性,字段不可再分割。

学生编号  姓名 性别   电子邮件       电话
20080901  张三  男   zs@126.com    88886666
20080902  李四  女   ls@126.com    66668888

第二范式彻底依赖,没有部分依赖。

选课表:每一列都不可再分割
学生  课程   教师  教师职称  教室  上课时间
李四 Spring 张老师 java讲师 301  08:00
张三 Struts 杨老师 java讲师 302  13:30

课程表:
课程        教材 
Spring 《Spring深刻浅出》 
Struts 《Struts in Action》

第三范式:没有传递依赖。

选课表:

学生  课程   教师   教室 上课时间
李四 Spring 张老师 301 08:00
张三 Struts 杨老师 302 13:30

教师表:
教师   教师职称
张老师 java讲师
杨老师 java讲师

BC范式:

第四范式:

第五范式:

优势:范式能够避免数据冗余,减小数据库的空间,减轻维护数据完整性的麻烦。

缺点:操做困难,由于须要联系多个表才能获得所须要数据,并且范式越高性能就会越差。

通常项目中使用第三范式就足够了。

2,简述UNION和UNION ALL的区别。

UNION用的比较多,union all是直接链接,取到得是全部值,记录可能有重复。union 是取惟一值,记录没有重复

(1)语法区别 

UNION 的语法以下:
            [SQL 语句 1]
            UNION
            [SQL 语句 2]
          UNION ALL 的语法以下:
            [SQL 语句 1]
            UNION ALL
            [SQL 语句 2]

    (2)效率:
         UNION和UNION ALL关键字都是将两个结果集合并为一个,但这二者从使用和效 

率上来讲都有所不一样。
a,对重复结果的处理:UNION在进行表连接后会筛选掉重复的记录,Union All不会去除重复记录。
b,对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。

c,从效率上说,UNION ALL 要比UNION快不少,因此,若是能够确认合并的两个结果集中不包含重复数据且不须要排序时的话,那么就使用UNION ALL。

3,SUM/COUNT/AVG/MAX/MIN函数和GROUP BY/HAVING/ORDER BY的执行顺序。

函数用法:

(1)AVG  返回指定组中的平均值,空值被忽略。
         例:select  prd_no,avg(qty) from sales group by prd_no
    (2)COUNT  返回指定组中项目的数量。
         例:select  count(prd_no) from sales
    (3)MAX  返回指定数据的最大值。
         例:select  prd_no,max(qty) from sales group by prd_no
    (4)MIN  返回指定数据的最小值。
         例:select  prd_no,min(qty) from sales group by prd_no
    (5)SUM  返回指定数据的和,只能用于数字列,空值被忽略。
         例:select  prd_no,sum(qty) from sales group by prd_no
    (6)COUNT_BIG  返回指定组中的项目数量,与COUNT函数不一样的是COUNT_BIG返回      bigint值,而COUNT返回的是int值。
         例:select  count_big(prd_no) from sales
    (7)GROUPING  产生一个附加的列,当用CUBE或ROLLUP运算符添加行时,输出值为1.当所添加的行不是由CUBE或ROLLUP产生时,输出值为0.
         例:select  prd_no,sum(qty),grouping(prd_no) from sales group by prd_no with rollup
    (8)BINARY_CHECKSUM  返回对表中的行或表达式列表计算的二进制校验值,用于检测表中行的更改。
         例:select  prd_no,binary_checksum(qty) from sales group by prd_no
    (9)CHECKSUM_AGG  返回指定数据的校验值,空值被忽略。
         例:select  prd_no,checksum_agg(binary_checksum(*)) from sales group by prd_no
    (10)CHECKSUM  返回在表的行上或在表达式列表上计算的校验值,用于生成哈希索引。
    (11)STDEV  返回给定表达式中全部值的统计标准误差。
         例:select  stdev(prd_no) from sales
    (12)STDEVP  返回给定表达式中的全部值的填充统计标准误差。
         例:select  stdevp(prd_no) from sales
    (13)VAR  返回给定表达式中全部值的统计方差。
         例:select  var(prd_no) from sales
    (14)VARP  返回给定表达式中全部值的填充的统计方差。
         例:select varp(prd_no) from sales

执行顺序:

SELECT  查询内容FROM  tablename WHERE  查询条件GROUP BY 分组条件 HAVING 取值范围 ORDER BY 排序列;

4,varhar和nvarchar的区别。
       varchar(n)长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是

一 个介于 1 和   8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。
   nvarchar(n)包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。

5, 写出一条Sql语句:取出表A中的第31到第40条记录(SQLServer,以自动增加的ID    做为主键,注意:ID可能不是连续的)。
(1)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)

6, SQL条件控制case… when… then… else… end…的用法。
--简单Case函数
CASE sex
         WHEN '1' THEN '男'
         WHEN '2' THEN '女'
ELSE '其余' END
 
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
         WHEN sex = '2' THEN '女'
ELSE '其余' END

 

如下为常见的算法问题及Linq的运用:

1,一列数的规则以下:一、一、二、三、五、八、1三、2一、34……求第30位数是多少,用递归算法实现。
    public static int Foo(int i)

{

          if (i <= 0)

                return 0;

          else if(i > 0 && i <= 2)

                return 1;

          else return Foo(i -1) + Foo(i - 2);

    }

2,取出两个数组中重复的值。
public static int[] GetRepeatData(int[] array1, int[] array2)

{

        return array1.Where(p => array2.Contains(p)).ToArray();

    }

3, 取出两个数组中不重复的值。
public static int[] GetNotRepeatData(int [] arry1,int[] arry2)

    {

        List<int> result = new List<int>();

        foreach (int a in arry1)

        {

            if (!arry2.Contains(a))

                 result.Add(a);

        }

        arry1 = new int[result.Count];  //从新设置长度

        result.CopyTo(arry1);          //将List结果复制到数组zong中;

        return arry1;

     }

4,去除一个数组中不重复的值。

public static int[] DelRepaetData(int[] arry)

    {

    return arry.GroupBy(p => p).Select(p => p.Key).ToArray();

}

 

5,求如下表达式的值,写出您想到的一种或几种实现方法:1-2+3-4+……+m。

      int Num = this.TextBox1.Text.ToString() ;

int Sum = 0 ;

for (int i = 0 ; i < Num + 1 ; i++)

{

  if((i%2) == 1)

{

   sum += i ;

}

 else

{

   sum = Sum  - i ;

}

}

System.Console.WriteLine(Sum.ToString());

System.Console.ReadLine() ;

 

6,任何把一个Array复制到Arraylist中?

 foreach (object item in Array), ArrayList.Add (item);

 

7,冒泡排序。

   int [] array = new int [*] ;

   int temp = 0 ;

   for (int i = 0 ; i < array.Length - 1 ; i++)

{

for (int j = i + 1 ; j < array.Length ; j++)

{

        if (array[j] < array[i])

{

           temp = array[i] ;

           array[i] = array[j] ;

           array[j] = temp ;

        }

}

}

8,给定如下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 );

}

}

9,请将字符串"I am a student"按单词逆序输出 如"student a am I"

string S = "I am a student";

    char[] C = new char[] { ' '};

    string[] n =S.Split(C);

    int length = S.Length;

for (int i =length-1 ; i >=0; i--)

{

          Console.Write(n[i]);

          if (i != 0)

{

               Console.Write(" ");

}

}

10,两个数组  [n] [m]  n>m  第一个数组的数字无序排列 第二个数组为空 取出第一个数组的最小值 放到第二个数组中第一个位置, 依次类推. 不能改变A数组,不能对之进行排序,也不能够倒到别的数组中。

    int[] a = { -20, 9, 7, 37, 38, 69, 89, -1, 59, 29, 0, -25, 39, 900, 22, 13};

    int[] b = new int[10];

    int intTmp = a[0], intMaxNum;

for (int i = 0; i < a.Length; i++)

{

         intTmp = a[i] > intTmp ? a[i] : intTmp;

}

    intMaxNum = intTmp;

for (int j = 0; j < b.Length; j++)

{

        for (int i = 0; i < a.Length; i++)

{

             if (j == 0)

                  intTmp = a[i] < intTmp ? a[i] : intTmp;

             else

{

                  if (a[i] > b[j - 1])

                       intTmp = a[i] < intTmp ? a[i] : intTmp;

}

}

        b[j] = intTmp;

        intTmp = intMaxNum;

}

foreach (int bb in b)

{

        Console.WriteLine(bb);

}

Console.ReadLine();

11,产生一个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];

}

相关文章
相关标签/搜索