1, 面向对象的思想主要包括什么?
封装、继承、多态。
TLW:
封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。
继承:子类拥有父类的所有数据和操作。
多态:一个程序中同名的不同方法共存的情况。
封装:封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承:继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
多态:通过继承实现的不同对象调用相同的方法,表现出不同的行为,称之为多态。
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、1、2、3、5、8、13、21、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];
}