王小科 电子工业出版
第一篇 面试求职第一步
一个例子:一支行军中的队伍长100米,一个传令兵从队尾跑至队头,再立即返回队尾,队伍正好前进了100米.假设队伍 和传令兵行进的速度恒定,问传令兵跑了多少米?
解:设士兵速度x,队伍y
追赶与相遇问题 [100/(x-y)+100/(x+y)]*y=100
解得x=(1+根号2)y
路程与速度成正比(时间相同),士兵路程为100(1+根号2),就是241.4米左右.
1、程序开发就是把抽象的东西现实化。
2、梦想、兴趣和坚持才是最重要的。思考也很重要
3、抱着“要做就做最好”的心态做任何事情。
4、大公司稳定、高薪,但其发展机会却远远小于小企业。
5、程序员成长路线
技术路线:初级程序员、高级程序员、系统分析师、系统设计师、产品经理、架构设计师
管理路线
第2篇 面试成功有道
1、 偏硬的IT公司(eg 硬件类和通信类)会对C++中指针的用法、数据结构考的多,偏软的公司(数据库类和软件类)会对设计模式、模板看重一些。
2、练习纸上写程序很重要。
第3篇 C#程序设计篇
1.C#中所有类型的基类是什么?请具体说明。
答:在.NET CTS(Common TypeSystem)中,每一个类型都直接或间接继承自Object类,所有这些类型其实都包含于
命名空间System中,所以C#中所有类型的基类是System.Object。CTS中所定义的每种类型,如果不是引用类型,那
么就是值类型。引用类型直接继承自Object,所有值类型直接继承自ValueType,ValueType又继承自Object。
.NET中引用类型包括:Class, Interface, Array,String, Delegate等.除此之外的那些类型都是值类型。
2. 简述 private、 protected、 public、 internal 修饰符的访问权限。
答:private : 私有成员, 在类的内部才可以访问。(类的成员、方法的默认)
protected : 保护成员,在该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。 (接口的默认修饰符,而且不能写)
internal: 在同一命名空间内可以访问。(类的默认修饰符)
3.列举ASP.NET页面之间传递值的几种方式。
答:1.URL传值
这是经典的传值方式, 如XXX.aspx?id=1&name=c; 不过所传递的值是会显示在浏览器的地址栏上的,而且不能
传递对象。所以这种方法一般用于传递的值少且安全性要求不高的情况下。
2.Session传值
这种方法将每份数据存储于服务器变量中,可以传递比较多的数据,并且安全性较高,所以常用于用户身份的验证功
能中。不过,Session变量如果存储过多的数据会消耗过多的服务器资源,编程者在使用时应该慎重。Session可在
应用程序的多个页面中以名称/值对的方式共享,直到浏览用户关闭自己的浏览器或者服务器Session超时(可设置,
默认为20分钟)停止。
Session具有以下特点:
Session中的数据保存在服务器端;
Session中可以保存任意类型的数据;
Session默认的生命周期是20分钟,可以手动设置更长或更短的时间。
3.Cookie传值
Cookie是一种比较特殊的数据存储方式,因为这种方式将数据存储于浏览用户的电脑中,以文本文件的形式存在于
磁盘中。这种方式非常有意思,很多登录系统就是利用Cookie实现用户自动登录。即用户登录一次的登录信息将被
写入到用户电脑的Cookie文件中,下次登录时,网站自动读取该Cookie完成身份验证。通过Cookie传递数据虽然很
方便,保存时间可以自由设置,但是安全性不高,编程者不应过于依赖Cookie,而应采用结合的方式完成敏感数据
的存储。
Cookie保存数据有以下特点:
Cookie中的数据保存在客户端;
Cookie中只能保存字符串类型的数据,如果需要在Cookie中保存其它类型数据,需要将其转换成字符串类型后保
存;
Cookie也有其默认生命周期,也可以手动设置,最大可设置成50年之后过期。
4.Server.Transfer传值
这个方法的步骤相对较多,使用该方法可以在另一个页面以公开对象属性的方式来存取值,使用这种方法是面向对象
的。该方法的代码编写并不复杂,首先通过定义一个public权限的属性,该属性可返回所需传递的值。然后在第二个
页面中,使用Context.Handler属性来获得前一个页面实例对象的引用,即可通过访问自定义的属性获取需要的值。
5.Application传值
严格地说应该是通过HttpApplication对象在服务器端生成一个状态变量来存储所需的信息,该HttpApplication对象
变量的可用范围覆盖整个WEB应用程序。所以该对象一般存储一些要公布的信息,如在线人数等,而对于那些涉及用
户个人的敏感数据则不用这种方法存储。HttpApplication对象有两个常用的方法,即Lock和UnLock方法,可用于处
理多个用户对存储在Application变量中的数据进行写入的问题。Lock方法锁定全部的Application变量,从而阻止其
他用户修改Application对象的变量值,UnLock方法则解除对HttpApplication对象变量的锁定。通过
HttpApplication对象传值的方法和Session比较相似,但是Session是对于每个单独的用户,当该用户关闭浏览器,
则Session失效。HttpApplication对象存储的变量是针对所有访问程序的用户,即使有用户关闭了浏览器,变量的值
不会丢失。
6.跨页面传送
跨页面传送和调用HttpServerUtility对象的Transfer方法有相似之处,不过效率更高。因为调用HttpServerUtility
对象的Transfer方法是基于服务器的方法,而跨页面传送是基于浏览器端的。这个方法主要是设置控件
的“PostBackUrl”属性,使该控件(如Button)操作后转向指定页面,并且这个指定页面可以直接获取前一个页面
的所有控件对象及其属性值。
7.如果有特殊需要,还可以使用其他方法,例如通过数据库存储临时数据等。
4.什么是委托?事件是不是一种委托?委托和事件的区别?为什么要使用委托?
答 : 委托是指具有相同函数签名(返回类型相同,参数类型、参数顺序及参数个数相同)的函数或方法的抽象,关
键字为delegate。
主要用途是三个:1)函数回调;2)传递方法;3)事件机制。
一个委托就是一个对象,它包含一个引用,指向一个方法。一旦创建并加以初始化,就可以将委托作为参数传入另一
个方法并调用,委托不带方法体。
事件是一种消息机制,一个狭义的委托,也就是事件是一个用于事件驱动模型的专用委托,对事件的声明,实际是声
明一个私有的委托变量,对委托变量进行封装,即委托变量加上event关键字后,不管其前面的访问修饰符是public
还是private,编译器都会将其编译为private。事件是一种特殊的委托。
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参
数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。以委托为参数的
函数具有一定的通用性。使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个
词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
5.override与重载的区别
答 :重载是方法的名称相同,但参数或参数类型不同。进行多次重载以适应不同的需求。
override 是进行对基类中方法的重写。主要针对标识virtual的虚函数。二者实质就不同。
6.一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。
<span style="font-size:14px;"><span style="font-size:18px;">public classMainClass
{
public staticvoid Main()
{
Console.WriteLine(Foo(30));
}
public staticint Foo(int i)
{
if(i <= 0)
return0;
elseif(i > 0 && i <= 2)
return1;
elsereturn Foo(i -1) + Foo(i - 2);
}
}</span></span>
7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
<span style="font-size:14px;"><span style="font-size:18px;">foreach(System.Windows.Forms.Control control in this.Controls)
{
if(control is System.Windows.Forms.TextBox)
{
System.Windows.Forms.TextBoxtb = (System.Windows.Forms.TextBox)control ;
tb.Text= String.Empty ;
}
}
</span></span>
8.请编程实现一个冒泡排序算法?
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 ;
}
}
}
9.求以下表达式的值,写出您想到的一种或几种实现方法: 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();
10.描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
答:C#中的索引器通常用于索引数组,索引器不单能索引数字(数组下标),还能索引一些HASHMAP的字符串,所以,通常来说,C#中类的索引器通常只有一个,就是THIS,但也可以有无数个,只要你的参数列表不同就可以了,索引器和返回值无关。 不是只能根据数字进行索引,可以用任意类型。
11.在下面的例子里
using System;
class A
{
publicA()
{
PrintFields();
}
publicvirtual void PrintFields(){}
}
class B:A
{
intx=1;
inty;
publicB()
{
y=-1;
}
publicoverride void PrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
}
当使用new B()创建B的实例时,产生什么输出?
答:X=1,Y=0;
12.ASP.net的身份验证方式有哪些?分别是什么原理?
答:Windows验证(默认)用IIS,Forms验证用账户,Passport验证用密钥。
13.在C#中,string str = null 与 string str= "" 请尽量使用文字或图象说明其中的区别。
答:string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。
14.请详述在.NET中类(class)与结构(struct)的异同?
答:结构不能有默认的构造函数,为结构的副本是由编译器创建和销毁的,所以不需要默认的构造函数和析构函数。结构是值类型,所以对结构变量所做的改变不会影响其原值,而类是引用类型,改变其变量的值会改变其原值。向方法传递结构时是通过值传递的,而不是通过引用。Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的。类可以实现接口。Class默认成员访问为private的,而结构是public的。
15.根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:
namespacetest
{
publicdelegate void OnDBOperate();
public classUserControlBase : System.Windows.Forms.UserControl
{
publicevent OnDBOperate OnNew;
privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgse)
{
if(e.Button.Equals(BtnNew))
{
//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。
}
}
}
答:if( OnNew != null )
OnNew( this, e);
16.分析以下代码,完成填空
string strTmp = "abcdefg某某某";
int i=System.Text.Encoding.Default.GetBytes(strTmp).Length;
int j= strTmp.Length;
答:i=13,j=10
17.给定以下XML文件,完成算法流程图。
<FileSystem>
< DriverC>
<DirDirName=”MSDOS622”>
<FileFileName =” Command.com” ></File>
</Dir>
<FileFileName =”MSDOS.SYS” ></File>
<FileFileName =” IO.SYS” ></File>
</DriverC>
</FileSystem>
请画出遍历所有文件名(FileName)的流程图(请使用递归算法)。
答:伪代码:
void FindFile(Directory d )
{
FileOrFolders= d.GetFileOrFolders();
foreach(FileOrFolder fof in FileOrFolders )
{
if(fof is File )
YouFound a file;
elseif ( fof is Directory )
FindFile(fof );
}
}
C#:
Public voidDomDepthFirst(XmlNode currentNode)
{
XmlNodenode=currentNode.FirstChild;
while(node!=null)
{
DomDepthFirst(node);
node=node.NextSibling;
}
if(node.Name=="File")
{
Console.Write(((XmlElement)node).GetAttribute("FileName")+"\r\n");
}
}
18.GC是什么? 为什么要有GC?
答:GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
19.String s = new String("xyz");创建了几个String Object?
答:两个对象,一个是“xyz”,一个是指向“xyz”的引用对象s。
20.抽象类和接口有什么区别?
答:抽象类是abstract修饰符用于表示所修饰的类不是完整的,并且只能用作基类。它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。抽象类不能创建类的实例,然而可以创建一个变量,其类型是一个抽象类,并让它含有对非抽象类的实例的引用。不能有抽象构造函数或抽象静态方法。abstract类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类。抽象类不能被密封。
接口(interface)是抽象类的变体。接口中的所有方法都是抽象的,没有一个有程序体。多继承性可通过实现这样的接口而获得。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
21.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
答:short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,所以不能显式转化为short型,可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。
答:
final,修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此 一个类不能既被声明为abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final的方法也同样只能使用,不能重载。
22.谈谈final, finally, finalize的区别。
finally,在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入finally 块(如果有的话)。
finalize,方法名。Finallize表示是object类一个方法,在垃圾回收机制中执行的时候会被调用被回收对象的方法。
23.进程和线程的区别?
答:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程
共享这个进程的资源。
24.产生一个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];
25.大概描述一下ASP.NET服务器控件的生命周期。
答:页请求->开始->页初始化-> 加载-> 验证-> 处理回发事件-> 预呈现-> 保存状态-> 呈现-> 卸载.
26.HashMap和Hashtable的区别。
答:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap键值可以为空(null),由于非线程安全,效率上可能高于Hashtable.
27.error和exception有什么区别?
答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
28.下面的例子中
using System;
class A
{
public static int X;
static A()
{
X=B.Y+1;
}
}
class B
{
public static int Y=A.X+1;
static B(){}
static void Main()
{
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
}
}
产生的输出结果是什么?
答:x=1,y=2
29.死锁的必要条件?怎么克服?
答:系统的资源不足,进程的推进的顺序不合适,资源分配不当,一个资源每次只能被一个进程使用,一个资源请求资源时,而此时这个资源已阻塞,对已获得资源不放,进程获得资源时,未使用完前,不能强行剥夺。
30.接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?
答:接口是可以继承接口的,抽象类是可以实现接口的,抽象类可以继承实体类,但是有个条件,条件是,实体类必须要有明确的构造函数。
31.New有几种用法?
答:有3种,第一种是,实例化如:New Class()。第二种是,public new 隐藏基类的方法。
第三种是,在泛型类申明中的任何类型参数都必须有公共的无参构造函数。
32.UDP和TCP连接有和异同?
答:TCP是传输控制协议,提供的是面向连接的,是可靠的,字节流服务,当用户和服务器彼此进行数据交互的时候,必须在他们数据交互前要进行TCP连接之后才能传输数据。TCP提供超时重拨,检验数据功能。UDP是用户数据报协议,是一个简单的面向数据报的传输协议,是不可靠的连接。
33.什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
答:应用程序域:就是为安全性,可靠性,隔离性,和版本控制,及卸载程序提供的隔离边界。它通常由运行库宿主创建,应用程序域提供了一个更安全,用途更广的处理单元。
托管代码:使用CLR编译语言编辑器开发编写的代码就叫托管代码。
装箱和拆箱:是把值类型转换为引用类型的过程,是隐式的,相反的过程就是拆箱,是显式的。
装箱分3部:
1)分配内存空间。包括要装箱的值类型的空间、方法表、SynBlockIndex,其中后两者用来管理引用对象。
2)值复制。把堆栈中要装箱的值复制到堆上。
3)返回引用对象的引用。
拆箱也分3部:
1) 检查类型,确保引用类型是装箱的结果。
2)指针返回,返回要拆箱的引用类型中的值的地址。
3)字段拷贝,把引用类型中的字段拷贝到堆栈中。
CTS是通用类型系统,CLS是通用语言规范,CLR通用语言运行时。
强类型系统:每个变量和对象都必须具有申明类型。
34.web service 数据传输有什么限制? 为什么?DataTable可以作为web service参数传递吗?
答:所传输的数据必须是可序列化的。因为需要转换为XML格式以可以穿越防火墙,做到真正的数据共享。因为DataSet处理DataTable的序列化以便进行封送处理,所以无法传递单个DataTable。在 ADO.NET 的三个基本数据对象 — DataReader、DataTable 和 DataSet 中,只有 DataSet 可以与 Web 服务之间传递。这是因为,为了与 Web 服务进行通信,对象必须是可序列化的。(序列化是一个过程,它用于将对象的公共属性转换为 XML,并且因为 XML 只是纯文本,所以可以将其从一个应用程序传输到另一个应用程序,并且可以穿越防火墙,从而克服了 COM 的主要障碍之一。)DataReader 无法序列化,因为它们需要到服务器的开放连接。并且,因为 DataSet 处理 DataTable 的序列化以便进行封送处理,所以您也无法传递单个 DataTable。
35.垃圾回收机制?
答:CLR实现的自动内存管理。需要清楚的几点:
1)什么被认为是可回收的对象?
GC采用一定的算法遍历所有的对象,找出可达对象和不可达对象,不可达对象是可回收的对象。
2)什么时候回收?
通常情况下:内存不足溢出时,确切的说,是第一代对象已满的时候。
3)如何回收?
垃圾收集进程来释放不可达对象的内存空间。
4)回收完后,还需要做什么?
避免托管堆上的内存碎片,重新分配内存,压缩托管堆。
5)避免垃圾回收带来的性能影响,采用代龄机制。
36.string和stringBuilder的区别,为什么同时存在2个类?
答:String类对象是不可改变的(只读),对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象,其方法ToString对性能的提高并非很显著。 因为一旦创建了该对象,就不能修改该对象的值。
在处理字符串时,最好使用stringBuilder类,其.NET命名空间是System.Text。该类并不是创建新的对象,而是通过append,remove,insert等方法直接对字符串进行操作,通过toString方法返回操作结果,因此当你需要大量拼接、删除、修改字符串时,使用stringBuilder可以优化性能。
37.在.net中,配件的意思是?
答:程序集。包括(中间语言(IL),元数据(metaData),资源(resource),装配清单(AL))。
38.谈一下remoting和webservice两项技术的理解(或有什么区别)以及实际中的应用。
答:WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。remoting是.net中用来跨越machine, process, appdomain 进行方法调用的技术,对于三层结构的程序,就可以使用remoting技术来构建.它是分布应用的基础技术.相当于以前的DCOM 。主要用在C/S架构的系统中。webService是一种构建应用程序的普通模型,并能在所有支持internet网通讯的操作系统上实施。webService使基于组件的开发和web的结合达到最佳,基于组件的对象模型。主要用在B/S架构的系统中。
39.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.
答:string inputStr=" xx xx ";
inputStr = Regex.Replace(inputStr.Trim(), @"\s+", " ");
40.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
答:一般为3层 数据访问层,业务层,表示层。 数据访问层对数据库进行增删查改。 业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。 表示层为了与用户交互例如用户添加表单。 优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。 缺点: 增加成本。
41.写出一条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)
42.ADO。NET相对于ADO等主要有什么改进?
答:1:ado.net不依赖于ole db提供程序,而是使用.net托管提供的程序
2:不使用com
3:不在支持动态游标和服务器端游
4:,可以断开connection而保留当前数据集可用
5:强类型转换
6:xml支持
43.读下列程序,你能说出其中进行了几次装箱和拆箱的操作吗?
using System;
class sample1
{
public static void Main()
{
int i=10;
object obj=i;
Console.WriteLine(i+","+(int)obj);
}
}
其中发生了三次装箱操作和一次拆箱操作。第一次object obj=i;将i装箱;而Console.WriteLine方法用的参数是String对象,因此,i+","+(int)obj中,i需要进行一次装箱(转换成String对象),(int)obj将obj对象拆箱成值类型,而根据WriteLine方法,比较将(int)obj值装箱成引用类型。