C#的130个面試題目大全

在網上搜索了一籮筐的C#面試題目,現在整理下,放這裡,希望能對自己對各位看官有所幫助

1. 简述 private、 protected、 public、 internal 修饰符的访问权限。
答 . private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 在同一命名空间内可以访问。

2 .列举ASP.NET页面之间传递值的几种方式。
答. 1.使用QueryString, 如....?id=1;
2 response. Redirect()....
3.使用Server.Transfer
4.application
5.sseion
6.cookies
7.server


3. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。
答:public class MainClass
{
public static void Main()
{
Console.WriteLine(Foo(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);
}
}

4.C#中的委托是什么?事件是不是一种委托?
答 :
委托可以把一个方法作为参数代入另一个方法。
委托可以理解为指向一个函数的引用。
是,是一种特殊的委托

5.override与overload的区别
答 :
override 与重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要
Override 是进行基类中函数的重写。为了适应需要。

6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理?
答 :
this.Server.Transfer
redirect

7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
答:
foreach (System.Windows.Forms.Control control in this.Controls)
{
if (control is System.Windows.Forms.TextBox)
{
System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ;
tb.Text = String.Empty ;
}
}

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)
{
temp = array ;
array = array[j] ;
array[j] = temp ;
}
}
}

9.描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
答:不是。可以用任意类型。

10.求以下表达式的值,写出您想到的一种或几种实现方法: 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() ;

11.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
答:一般为3层
数据访问层,业务层,表示层。
数据访问层对数据库进行增删查改。
业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。
表示层为了与用户交互例如用户添加表单。
优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。
缺点: 增加成本。

12.在下面的例子里
using System;
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B()
{
y=-1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
当使用new B()创建B的实例时,产生什么输出?
答:X=1,Y=0;x= 1 y = -1

13.什么叫应用程序域?
答:应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。

14.CTS、CLS、CLR分别作何解释?
答:CTS:通用语言系统。
CLS:通用语言规范。
CLR:公共语言运行库。

15.什么是装箱和拆箱?
答:从值类型接口转换到引用类型装箱。
从引用类型转换到值类型拆箱。

16.什么是受管制的代码?
答:unsafe:非托管代码。不经过CLR运行。

17.什么是强类型系统?
答:RTTI:类型识别系统。

18.net中读写数据库需要用到那些类?他们的作用?
答:DataSet:数据存储器。
DataCommand:执行语句命令。
DataAdapter:数据的集合,用语填充。

13.什么是code-Behind技术。
答:代码分离,这是个明智的东西,像ASP这样混成一堆很不爽.或者可以理解成HTML代码写在前台,C#代码写在后台.当然前台也有脚本,类的调用等,其实写在一起也是可以的.
eg.aspx+cs

21.在.net中,配件的意思是?
答:程序集。(中间语言,源数据,资源,装配清单)

22.常用的调用WebService的方法有哪些?
答:1.使用WSDL.exe命令行工具。
2.使用VS.NET中的Add Web Reference菜单选项

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

24.在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。
答:string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。

25.请详述在dotnet中类(class)与结构(struct)的异同?
答:Class可以被实例化,属于引用类型,是分配在内存的堆上的,
Struct属于值类型,是分配在内存的栈上的.

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,那么死锁会发生)

30.简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。
答:WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。

31.公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行 (排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的思路
答:根据点击的列头,包该列的ID取出,按照该ID排序后,在给绑定到ListView中。

32.给定以下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 );
}
}

33.写出一条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)

36.GC是什么? 为什么要有GC?
答:GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()

37.String s = new String("xyz");创建了几个String Object?
答:两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。

38.abstract class和interface有什么区别?
答:
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

39.启动一个线程是用run()还是start()?
答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。
run()方法可以产生必须退出的标志来停止一个线程。

40.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
答:接口可以继承接口。抽象类可以实现(implements)接口,
抽象类可继承实体类,但前提是实体类必须有明确的构造函数。

41.构造器Constructor是否可被override?
答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

42.是否可以继承String类?
答:String类是final类故不可以继承。

43.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
答:会执行,在return前执行。

44.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答:不对,有相同的hash code。

45.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
答:switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。
long,string 都不能作用于swtich。

47.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。

48.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
答:都不能。

49.List, Set, Map是否继承自Collection接口?
答:List,Set是Map不是
map:集合类型

50.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
答:Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值
equals:对类,对象说的等引用类型
==: 对值类型

51.数组有没有length()这个方法? String有没有length()这个方法?
答:数组没有length()这个方法,有length的属性。String有有length()这个方法。

52.sleep() 和 wait() 有什么区别?
答:sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级
(b)正在运行的线程因为其它原因而阻塞。
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

53.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正确。

54.谈谈final, finally, finalize的区别。
答:
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此 一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中 不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final的方法也同样只能使用,不能重载
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会 执行,然后控制就会进入 finally 块(如果有的话)。
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理 工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的 ,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

55.如何处理几十万条并发数据?
答:用存储过程或事务。取得最大标识的时候同时更新..注意主键不是自增量方式这种方法并发的时候是不会有重复主键的..取得最大标识要有一个存储过程来获取.

56.Session有什么重大BUG,微软提出了什么方法加以解决?
答:是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。

57.进程和线程的区别?
答:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。

58.堆和栈的区别?
答:
栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。
堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。

59.成员变量和成员函数前加static的作用?
答:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。

60.ASP。NET与ASP相比,主要有哪些进步?
答:asp解释形,aspx编译型,性能提高,有利于保护源码。

61.产生一个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=(int)myList;


64.向服务器发送请求有几种方式?
答:get,post。get一般为链接方式,post一般为按钮方式。

65.DataReader与Dataset有什么区别?
答:一个是只能向前的只读游标,一个是内存中的表。

66.软件开发过程一般有几个阶段?每个阶段的作用?
答:需求分析,架构设计,代码编写,QA,部署

67.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令 和语句 new 创建实例 new 隐藏基类中方法。
答:using 引入名称空间或者使用非托管资源
new 新建实例或者隐藏父类方法

68.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.
答:string inputStr=" xx xx ";
inputStr=Regex.Replace(inputStr.Trim()," *"," ");

69.下面这段代码输出什么?为什么?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");
答:不相等,因为比较的是对象

70.什么叫做SQL注入,如何防止?请举例说明。
答:利用sql关键字对网站进行攻击。过滤关键字'等

72.用Singleton如何写设计模式
答:static属性里面new ,构造函数private

73.什么是Application Pool?
答:Web应用,类似Thread Pool,提高并发性能。

74.什么是虚函数?什么是抽象函数?
答:虚函数:没有实现的,可由子类继承并重写的函数。
抽象函数:规定其非虚子类必须实现的函数,必须被重写。

75.什么是XML?
答:XML即可扩展标记语言。eXtensible Markup Language.标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,即可以选择国际通用的标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到的有XML、XSL和XPath等。

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

77.什么是ASP.net中的用户控件?
答:用户控件一般用在内容多为静态,或者少许会改变的情况下..用的比较大..类似ASP中的include..但是功能要强大的多。

78.列举一下你所了解的XML技术及其应用
答:xml用于配置,用于保存静态数据类型.接触XML最多的是web Services..和config

79.ADO.net中常用的对象有哪些?分别描述一下。
答:Connection 数据库连接对象
Command 数据库命令
DataReader 数据读取器
DataSet 数据集


81.什么是SOAP,有哪些应用。
答:simple object access protocal,简单对象接受协议.以xml为基本编码结构,建立在已有通信协议上(如http,不过据说ms在搞最底层的架构在tcp/ip上的soap)的一种规范Web Service使用的协议..

82.C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?
答:一个是属性,用于存取类的字段,
一个是特性,用来标识类,方法等的附加性质

83.XML 与 HTML 的主要区别
答:1. XML是区分大小写字母的,HTML不区分。
2. 在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束 标记。在XML中,绝对不能省略掉结束标记。
3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用 查找结束标记了。
4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。

84.c#中的三元运算符是?
答:?:。

85.当整数a赋值给一个object对象时,整数a将会被?
答:装箱。

86.类成员有_____种可访问形式?
答:this.;new Class().Method;

87.public static const int A=1;这段代码有错误么?是什么?
答:const不能用static修饰。

88.float f=-123.567F; int i=(int)f;i的值现在是_____?
答:-123。

90.用sealed修饰的类有什么特点?
答:密封,不能继承。

91.在Asp.net中所有的自定义用户控件都必须继承自________?
答:Control。

92.在.Net中所有可序列化的类都被标记为_____?
答:[serializable]

93.在.Net托管代码中我们不用担心内存漏洞,这是因为有了______?
答:GC。

94.下面的代码中有什么错误吗?_______
using System;
class A
{
public virtual void F(){
Console.WriteLine("A.F");
}
}
abstract class B:A
{
public abstract override void F(); 答:abstract override 是不可以一起修饰.
} // new public abstract void F();

95.当类T只声明了私有实例构造函数时,则在T的程序文本外部,___可以___(可以 or 不可以)从T派生出新的类,不可以____(可以 or 不可以)直接创建T的任何实。
答:不可以,不可以。

96.下面这段代码有错误么?
switch (i){
case(): 答://case()条件不能为空
CaseZero();
break;
case 1:
CaseOne();
break;
case 2:
dufault; 答://wrong,格式不正确
CaseTwo();
break;
}

97.在.Net中,类System.Web.UI.Page 可以被继承么?
答:可以。

98..net的错误处理机制是什么?
答:.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。

99.利用operator声明且仅声明了==,有什么错误么?
答:要同时修改Equale和GetHash() ? 重载了"==" 就必须重载 "!="

100.在.net(C# or vb.net)中如何用户自定义消息,并在窗体中处理这些消息。
答:在form中重载DefWndProc函数来处理消息:
protected override void DefWndProc ( ref System.WinForms.Message m )
{
switch(m.msg)
{
case WM_Lbutton :
  ///string与MFC中的CString的Format函数的使用方法有所不同
  string message = string.Format("收到消息!参数为:{0},{1}",m.wParam,m.lParam);
  MessageBox.Show(message);///显示一个消息框
  break;
case USER:
处理的代码
default:
  base.DefWndProc(ref m);///调用基类函数处理非自定义消息。
  break;
}
}

101.在.net(C# or vb.net)中如何取消一个窗体的关闭。
答:private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel=true;
}

102.在.net(C# or vb.net)中,Appplication.Exit 还是 Form.Close有什么不同?
答:一个是退出整个应用程序,一个是关闭其中一个form。

103.在C#中有一个double型的变量,比如10321.5,比如122235401.21644,作为货币的值如何按各个不同国家的习惯来输出。比如美国用$10,321.50和$122,235,401.22而在英国则为£10 321.50和£122 235 401.22
答:System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-US");
//System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-GB");为英 国 货币类型
decimal y = 9999999999999999999999999999m;
string str = String.Format(MyCulture,"My amount = {0:c}",y);

104.某一密码仅使用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

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

105.对于这样的一个枚举类型:
enum Color:byte
{
Red,
Green,
Blue,
Orange
}
答:string[] ss=Enum.GetNames(typeof(Color));
byte[] bb=Enum.GetValues(typeof(Color));


107.C#可否对内存进行直接的操作?
答:在.net下,.net引用了垃圾回收(GC)功能,它替代了程序员 不过在C#中,不能直接实现Finalize方法,而是在析构函数中调用基类的Finalize()方法

108.ADO。NET相对于ADO等主要有什么改进?
答:1:ado.net不依赖于ole db提供程序,而是使用.net托管提供的程序,2:不使用com3:不在支持动态游标和服务器端游 4:,可以断开connection而保留当前数据集可用 5:强类型转换 6 ml支持

109.写一个HTML页面,实现以下功能,左键点击页面时显示“您好”,右键点击时显示“禁止右键”。并在2分钟后自动关闭页面。
答:<script language=javascript>
setTimeout('window.close();',3000);
function show()
{
if (window.event.button == 1)
{
alert("左");
}
else if (window.event.button == 2)
{
alert("右");
}
}
</script>

110.大概描述一下ASP。NET服务器控件的生命周期
答:初始化 加载视图状态 处理回发数据 加载 发送回发更改通知 处理回发事件 预呈现 保存状态 呈现 处置 卸载

111.Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
答:不能,可以实现接口

112.Static Nested Class 和 Inner Class的不同,说得越多越好
答:Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。

113.,&和&&的区别。
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and).

114.HashMap和Hashtable的区别。
答:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable.

116.Overloaded的方法是否可以改变返回值的类型?
答:Overloaded的方法是可以改变返回值的类型。

117.error和exception有什么区别?
答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

118.<%# %> 和 <% %> 有什么区别?
答:<%# %>表示绑定的数据源
<% %>是服务器端代码块

119.你觉得ASP.NET 2.0(VS2005)和你以前使用的开发工具(.Net 1.0或其他)有什么最大的区别?你在以前的平台上使用的哪些开发思想(pattern / architecture)可以移植到ASP.NET 2.0上 (或者已经内嵌在ASP.NET 2.0中)
答:1 ASP.NET 2.0 把一些代码进行了封装打包,所以相比1.0相同功能减少了很多代码.
2 同时支持代码分离和页面嵌入服务器端代码两种模式,以前1.0版本,.NET提示帮助只有在分离的代码文件,无 法 在页面嵌入服务器端代码获得帮助提示,
3 代码和设计界面切换的时候,2.0支持光标定位.这个我比较喜欢
4 在绑定数据,做表的分页.UPDATE,DELETE,等操作都可以可视化操作,方便了初学者
5 在ASP.NET中增加了40多个新的控件,减少了工作量

125.分析以下代码。
public static void test(string ConnectString)

{

System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
conn.ConnectionString = ConnectString;
try

{
conn.Open();
…….
}
catch(Exception Ex)
{
MessageBox.Show(Ex.ToString());
}
finally
{

if (!conn.State.Equals(ConnectionState.Closed))
conn.Close();
}
}
请问

1)以上代码可以正确使用连接池吗?

答:回答:如果传入的connectionString是一模一样的话,可以正确使用连接池。不过一模一样的意思是,连字符的空格数,顺序完全一致。

2)以上代码所使用的异常处理方法,是否所有在test方法内的异常都可以被捕捉并显示出来?

答:只可以捕捉数据库连接中的异常吧. (finally中,catch中,如果有别的可能引发异常的操作,也应该用try,catch。所以理论上并非所有异常都会被捕捉。)


127.什么是WSE?目前最新的版本是多少?
答:WSE (Web Service Extension) 包来提供最新的WEB服务安全保证,目前最新版本2.0。

128.在下面的例子里
using System;
class A
{
public A(){
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B(){
y=-1;
}
public override void PrintFields(){
Console.WriteLine("x={0},y={1}",x,y);
}
当使用new B()创建B的实例时,产生什么输出?
答:X=1,Y=0

129.下面的例子中

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


-----------------------------------
asp.net面试题目集合
1 :维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么
答:尽可能用约束(包括CHECK、主键、唯一键、外键、非空字段)实现,这种方式的效率最好;其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性、一致性;最后再考虑用自写业务逻辑实现,但这种方式效率最低、编程最复杂,当为下下之策

2 : ADO。NET相对于ADO等主要有什么改进?
答 ADO数据以Recordset 形式存储 ADO.NET以DataSet形式存储
Recordset对数据库持续连接访问ADO.NET提供对数据库断开连接
ADO.NET与ADO相比,优势在于提供了数据集和数据适配器,有利于实现分布式处理,降低对数据库服务器资源的消耗。

3 : ASP。NET与ASP相比,主要有哪些进步?
答 asp.net 可以使用强类型语言
页面是编译,执行速度快, 增加安全性和可靠性
,通过继承机制来支持代码的重用,提供声明性服务器控件减少代码行数
Asp需要解释,执行速度慢,重用代码不方便,没有调试机制

5:new有几种用法
第一种:new Class();
第二种:覆盖方法
public new XXXX(){}
第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。

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

7:datagrid.datasouse可以连接什么数据源
答 [dataset,datatable,dataview] dataset,datatable,dataview , IList

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

9:概述o/r mapping 的原理
答 利用反射,配置 将类于数据库表映射

19:什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
答 应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小
受管制的代码:unsafe:非托管代码。不经过CLR运行。
强类型系统 RTTI:类型识别系统。
装箱就是把值类型到引用类型的转换
拆箱就是引用类型到值类型的转换
重载 方法名相同 不用个数的参数或者指定不同参数类型
CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。
class box{
int aa(object i)
{}
object bb()
{}
}
int bb=5
new box().aa(bb) //装箱
int conver=(int)new box().zz(); //拆箱
//重载
public void aaa(int rad)
{ }
public void aaa(int len,int bre )
{ }
public void aaa(sting str)
{ }

20:列举一下你所了解的XML技术及其应用
答:xml可以统一数据格式,XML可是好东西,保存配置,站与站之间的交流,WEB SERVICE都要用它.

22:如何理解委托?
答:据说相当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法.
msdn2005中是这样解释的:
委托具有以下特点:委托类似于 C++ 函数指针,但它是类型安全的。
委托允许将方法作为参数进行传递。委托可用于定义回调方法
委托可以链接在一起;例如,可以对一个事件调用多个方法。
方法不需要与委托签名精确匹配。

24:UDP连接和TCP连接的异同。
答: udp前者只管传,不管数据到不到,无须建立连接. tcp后者保证传输的数据准确,须要连结.

26:进程和线程分别怎么理解?
答:进程是老子,线程是儿子,没有老子就没有儿子,一个老子可以有多个儿子.一个儿子可以成为别人的儿子,一个老子也可以为别的老子生儿子.

28:net中读写XML的类都归属于哪些命名空间?
答:System.Xml

29解释一下UDDI、WSDL的意义及其作用
答:UDDI 用于注册各个服务提供商提供的服务 以便可以共享它们 它还有助于WEB服务客户或web用户查找该Web服务
wsdl 是web服务描述语言(web Services Description Language)

30:什么是SOAP,有哪些应用。
答:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息,具体请看

32:常用的调用webservice方法有哪些?
答 HTTP-get Http-post Http-soap

33 概述.NET里对 remoting 和 webservice 两项技术的理解和实际中的应用。
答 远程逻辑调用,remoing接口只能用在.net中

35:列举ASP.NET 页面之间传递值的几种方式。
答. 1.使用QueryString,
源页面
string url;
url="anotherwebform.aspx?name=" + TextBox1.Text
Response.Redirect(url);
目标页面
Label1.Text=Request.QueryString["name"];
2.使用Session变量
源页面
Session["name"]=TextBox1.Text;
Session["email"]=TextBox2.Text;
Server.Transfer("anotherwebform.aspx");
目标页面
Label1.Text=Session["name"].ToString();
Label2.Text=Session["email"].ToString();
Session.Remove("name");
Session.Remove("email");
3.使用Server.Transfer
源页面代码:
public string Name
{
get {
return TextBox1.Text; }
}
//然后调用Server.Transfer方法
private void Button1_Click
(object sender, System.EventArgs e)
{
Server.Transfer("anotherwebform.aspx");
}
目标页面代码:
private void Page_Load
(object sender, System.EventArgs e)
{
WebForm1 wf1;
wf1=(WebForm1)Context.Handler;
Label1.Text=wf1.Name;
} ;

44:ASP.net的身份验证方式有哪些?分别是什么原理?
答:Windwos(默认)用IIS...
From(窗体)用帐户
Passport(密钥)

51:用C#实现以下功能
b 对上面生成的数组排序,需要支持升序、降序两种顺序
答 L.Reverse(L);
L.Sort(L);

52:请说明.net中的错误处理机制,并举例
答 异常是从 Exception 类类继承的对象。异常从发生问题的代码区域引发,然后沿堆栈向上传递,直到应用程序处理它或程序终止。
try
{ //执行代码,不确定是否会出错 }
catch
{ //出错处理 }
finally
{ //无论怎样,都要执行 }

53:请说出强名的含义
答 垃圾回收的原理是根据是否空引用,和该数据类型占用内存来判断该收回多少内存.强类型说白就是必须要有个数据类型.

54:请列出c#中几种循环的方法,并指出他们的不同
答 FOR WHILE foreach do while

55:请指出.net中所有类型的基类
答 object

57:SQL SREVER中,向一个表中插入了新数据,如何快捷的得到自增量字段的当前值
答 INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)

58:什么是WEB控件?使用WEB控件有那些优势?
答 web控件就是可以在服务器执行的控件,优势在于可以回传数据,带有事件驱动

59: 请解释ASP。NET中以什么方式进行数据验证?
答 .net中提供了几个数据验证控件,可以在服务器端或者客户端进行验证。

60: 请谈谈对正则表达式的看法?
答 主要用在字符串的匹配上面,与具体的语言环境无关。

61: ASP。NET中共有几种类型的控件?各有什么区别?
答 Html 控件 传统的html标记
Web 控件 可以回传数据,事件驱动
自定义 控件 在原有控件的基础上增加功能
复合控件 多个子控件复合成一个新的控件

62: WEB控件可以激法服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回。
答 通过实现IPostBack这个接口来执行事件。自动回传就是AutoPostBack,使用自动回传可以监视客户端变化情况并将这种改变返回到服务器端

63: WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
答 能,服务器端控件在html中表现形式还是html标记,所以可以执行客户端事件,有多种方式:1、control.Attributes["onclick"]="...;";
2、<script for="controlName" event="onclick"></script>

64: 请解释ASP。NET中的web页面与其隐藏类之间的关系?
答 继承的关系

65: 什么是viewstate,能否禁用?是否所用控件都可以禁用?
答 可以全部禁用,viewstate就是hidden input,只不过加上了微软的编码方式记录控件的状态

66: 当发现不能读取页面上的输入的数据时很有可能是什么原因造成的?怎么解决
答 可能就是事件没有关联,或者根本就没有写读取代码。
解决 检查代码, 设断点调试

67:请解释一个WEB页面中代码执行次序。
答 参看.cs 知道最先执行OnInit(); 然后到Page_Load,最后到具体的执行事件。

68:请解释什么是上下文对象,在什么情况下要使用上下文对象
答 HttpContext, 在类中调用的时候需要用到HttpContext

69:请解释转发与跳转的区别?
答 Transfer 是转发 包括HttpHandler对象
Redirect 就是跳转

70: 请解释ASP。NET中button linkbutton imagebutton 及hyperlink这四个控件之间的功别
答 button imagebutton 将数据传递回服务器
hyperlinK 页面之间的导航
linkbutton主要用于将数据保存到服务器或访问服务器上的数据

71:请解释一下。NET多层应用程序中层与层之间以那几种方式进行数据传递。并解释你自己的项目中采用那种方式进行。
答 这个传递方式不定,很多都是传递DataSet, XML也可以

72:如果出现ASP。NET中的事件不能触发可能由于什么原因造成?
答 事件丢失,特别是使用vss的时候最容易造成这种情况,原因不明

73:如果需要在datagride控件中的某一列中添加下拉列表框并绑定数据怎么解决?
答 使用模板列来添加dropdownlist,绑定数据使用代码前置的方式

74:请解释asp.net中的数据绑定与传统数据绑定有什么区别?
答 更灵活 更方便

75:请解释.net采用委托实现的事件模型与JAVA中采用接口实现的事件模型有什么区别,
答 以图示方式解释。

76:请解释接口的显式实现有什么意义?
答 规定强制执行,保持一致

77: 什么情况用HTML控件,什么情况用WEB控件,并比较两者差别
答 客户端表现用html控件,如果想和server端交互,那么加上runat=server,它就成了服务器端控件,但它没有web控件的很多方法和属性,如果你需要用到,那么还是用web controls

78: C#中的接口和类有什么异同。
答 接口只能包含抽象方法,不能包含任何方法实现,不能创建接口实例,接口成员没有访问修饰符,接口成员必须是方法属性事件或者索引器不能包含常数字段运算符也不能有静态成员

-----------------------------------------------------

1.静态变量和非静态变量的区别?
答:
静态变量:
静态变量使用 static 修饰符进行声明
在所属类被装载时创建
通过类进行访问
所属类的所有实例的同一静态变量都是同一个值
非静态变量:
不带有 static 修饰符声明的变量称做非静态变量
在类被实例化时创建
通过对象进行访问
同一个类的不同实例的同一非静态变量可以是不同的值
示例:

CODE:

using System;
using System.Collections.Generic;
using System.Text;
namespace Example01
{
class Program
{
class Class1
{
public static String staticStr = "Class";
public String notstaticStr = "Obj";
}
static void Main(string[] args)
{
//静态变量通过类进行访问,该类所有实例的同一静态变量都是同一个值
Console.WriteLine("Class1's staticStr: {0}", Class1.staticStr);
Class1 tmpObj1 = new Class1();
tmpObj1.notstaticStr = "tmpObj1";
Class1 tmpObj2 = new Class1();
tmpObj2.notstaticStr = "tmpObj2";
//非静态变量通过对象进行访问,不同对象的同一非静态变量可以有不同的值
Console.WriteLine("tmpObj1's notstaticStr: {0}", tmpObj1.notstaticStr);
Console.WriteLine("tmpObj2's notstaticStr: {0}", tmpObj2.notstaticStr);
Console.ReadLine();
}
}
}


结果:
Class1's staticStr: Class
tmpObj1's notstaticStr: tmpObj1
tmpObj2's notstaticStr: tmpObj2

2.const 和 static readonly 区别?
答:
const
用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序
static readonly
用 static readonly 修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化
示例:
测试类:

CODE:

using System;
using System.Collections.Generic;
using System.Text;
namespace Example02Lib
{
public class Class1
{
public const String strConst = "Const";
public static readonly String strStaticReadonly = "StaticReadonly";
//public const String strConst = "Const Changed";
//public static readonly String strStaticReadonly = "StaticReadonly Changed";
}//5-1-a-s-p-x
}


客户端代码:

CODE:

using System;
using System.Collections.Generic;
using System.Text;
using Example02Lib;
namespace Example02
{
class Program
{
static void Main(string[] args)
{
//修改Example02中Class1的strConst初始值后,只编译Example02Lib项目
//然后到资源管理器里把新编译的Example02Lib.dll拷贝Example02.exe所在的目录,执行Example02.exe
//切不可在IDE里直接调试运行因为这会重新编译整个解决方案!!
//可以看到strConst的输出没有改变,而strStaticReadonly的输出已经改变
//表明Const变量是在编译期初始化并嵌入到客户端程序,而StaticReadonly是在运行时初始化的
Console.WriteLine("strConst : {0}", Class1.strConst);
Console.WriteLine("strStaticReadonly : {0}", Class1.strStaticReadonly);
Console.ReadLine();
}
}
}


结果:
strConst : Const
strStaticReadonly : StaticReadonly
修改后的示例:
测试类:

CODE:

using System;
using System.Collections.Generic;
using System.Text;
namespace Example02Lib
{
public class Class1
{
//public const String strConst = "Const";
//public static readonly String strStaticReadonly = "StaticReadonly";
public const String strConst = "Const Changed";
public static readonly String strStaticReadonly = "StaticReadonly Changed";
}
}


结果
strConst : Const
strStaticReadonly : StaticReadonly Changed

3.extern 是什么意思?
答:
extern 修饰符用于声明由程序集外部实现的成员函数
经常用于系统API函数的调用(通过 DllImport )。注意,和DllImport一起使用时要加上 static 修饰符
也可以用于对于同一程序集不同版本组件的调用(用 extern 声明别名)
不能与 abstract 修饰符同时使用(aspx1.com)
示例:

CODE:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Example03
{
class Program
{
//注意DllImport是一个Attribute Property,在System.Runtime.InteropServices命名空间中定义
//extern与DllImport一起使用时必须再加上一个static修饰符
[DllImport("User32.dll")]
public static extern int MessageBox(int Handle, string Message, string Caption, int Type);
static int Main()
{
string myString;
Console.Write("Enter your message: ");
myString = Console.ReadLine();
return MessageBox(0, myString, "My Message Box", 0);
}
}
}


结果:

4.abstract 是什么意思?
答:
abstract 修饰符可以用于类、方法、属性、事件和索引指示器(indexer),表示其为抽象成员
abstract 不可以和 static 、virtual 、override 一起使用
声明为 abstract 成员可以不包括实现代码,但只有类中还有未实现的抽象成员,该类就不可以被实例化,通常用于强制继承类必须实现某一成员
示例:
CODE:
using System;
using System.Collections.Generic;
using System.Text;
namespace Example04
{
#region 基类,抽象类
public abstract class BaseClass
{
//抽象属性,同时具有get和set访问器表示继承类必须将该属性实现为可读写
public abstract String Attribute
{
get;
set;
}
//抽象方法,传入一个字符串参数无返回值
public abstract void Function(String value);
//抽象事件,类型为系统预定义的代理(delegate):EventHandler
public abstract event EventHandler Event;
//抽象索引指示器,只具有get访问器表示继承类必须将该索引指示器实现为只读
public abstract Char this[int Index]
{
get;
}
}
#endregion
#region 继承类
public class DeriveClass : BaseClass
{
private String attribute;
public override String Attribute
{
get
{
return attribute;
}
set
{
attribute = value;
}
}
public override void Function(String value)
{
attribute = value;
if (Event != null)
{
Event(this, new EventArgs());
}
}
public override event EventHandler Event;
public override Char this[int Index]
{
get
{
return attribute[Index];
}
}
}
#endregion
class Program
{
static void OnFunction(object sender, EventArgs e)
{
for (int i = 0; i < ((DeriveClass)sender).Attribute.Length; i++)
{
Console.WriteLine(((DeriveClass)sender));
}
}
static void Main(string[] args)
{
DeriveClass tmpObj = new DeriveClass();
tmpObj.Attribute = "1234567";
Console.WriteLine(tmpObj.Attribute);
//将静态函数OnFunction与tmpObj对象的Event事件进行关联
tmpObj.Event += new EventHandler(OnFunction);
tmpObj.Function("7654321");
Console.ReadLine();
}
}
}


结果:
1234567
7
6
5
4
3
2
1

5.internal 修饰符起什么作用?
答:
internal 修饰符可以用于类型或成员,使用该修饰符声明的类型或成员只能在同一程集内访问
接口的成员不能使用 internal 修饰符
示例
Example05Lib 项目的 Class1

CODE:

using System;
using System.Collections.Generic;
using System.Text;
namespace Example05Lib
{
public class Class1
{
internal String strInternal = null;
public String strPublic;
}
}


结果
Example05Lib 项目的 Class2 类可以访问到 Class1 的 strInternal 成员

Example05 项目的 Program 类无法访问到 Class1 的 strInternal 成员


6.sealed 修饰符是干什么的?
答:
sealed 修饰符表示密封
用于类时,表示该类不能再被继承,不能和 abstract 同时使用,因为这两个修饰符在含义上互相排斥
用于方法和属性时,表示该方法或属性不能再被继承,必须和 override 关键字一起使用,因为使用 sealed 修饰符的方法或属性肯定是基类中相应的虚成员
通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱
恰当的利用 sealed 修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员
示例:

CODE:

using System;
using System.Collections.Generic;
using System.Text;
namespace Example06
{
class Program
{
class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
public virtual void G()
{
Console.WriteLine("A.G");
}
}
class B : A
{
public sealed override void F()
{
Console.WriteLine("B.F");
}
public override void G()
{
Console.WriteLine("B.G");
}
}
class C : B
{
public override void G()
{
Console.WriteLine("C.G");
}
}
static void Main(string[] args)
{
new A().F();
new A().G();
new B().F();
new B().G();
new C().F();
new C().G();
Console.ReadLine();
}
}
}
结果:
类 B 在继承类 A 时可以重写两个虚函数,如图所示:
由于类 B 中对 F 方法进行了密封, 类 C 在继承类 B 时只能重写一个函数,如图所示:

控制台输出结果,类 C 的方法 F 只能是输出 类B 中对该方法的实现:
A.F
A.G
B.F
B.G
B.F
C.G

8.什么是索引指示器?
答:
实现索引指示器(indexer)的类可以象数组那样使用其实例后的对象,但与数组不同的是索引指示器的参数类型不仅限于int
简单来说,其本质就是一个含参数属性
示例:
CODE:
using System;
using System.Collections.Generic;
using System.Text;
namespace Example08
{
public class Point
{
private double x, y;
public Point(double X, double Y)
{
x = X;
y = Y;
}
//重写ToString方法方便输出
public override string ToString()
{
return String.Format("X: {0} , Y: {1}", x, y);
}
}
public class Points
{
Point[] points;
public Points(Point[] Points)
{
points = Points;
}
public int PointNumber
{
get
{
return points.Length;
}
}
//实现索引访问器
public Point this[int Index]
{
get
{
return points[Index];
}
}
}

//索引指示器的实质是含参属性,参数并不只限于int
class WeatherOfWeek
{
public string this[int Index]
{
get
{
//注意case段使用return直接返回所以不需要break
switch (Index)
{
case 0:
{
return "Today is cloudy!";
}
case 5:
{
return "Today is thundershower!";
}
default:
{
return "Today is fine!";
}
}
}
}
public string this[string Day]
{
get
{
string TodayWeather = null;
//switch的标准写法
switch (Day)
{
case "Sunday":
{
TodayWeather = "Today is cloudy!";
break;
}
case "Friday":
{
TodayWeather = "Today is thundershower!";
break;
}
default:
{
TodayWeather = "Today is fine!";
break;
}
}
return TodayWeather;
}
}
}
class Program
{
static void Main(string[] args)
{
Point[] tmpPoints = new Point[10];
for (int i = 0; i < tmpPoints.Length; i++)
{
tmpPoints = new Point(i, Math.Sin(i));
}
Points tmpObj = new Points(tmpPoints);
for (int i = 0; i < tmpObj.PointNumber; i++)
{
Console.WriteLine(tmpObj);
}

string[] Week = new string[] { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Staurday"};
WeatherOfWeek tmpWeatherOfWeek = new WeatherOfWeek();
for (int i = 0; i < 6; i++)
{
Console.WriteLine(tmpWeatherOfWeek);
}
foreach (string tmpDay in Week)
{
Console.WriteLine(tmpWeatherOfWeek[tmpDay]);
}
Console.ReadLine();
}
}
}


结果:
X: 0 , Y: 0
X: 1 , Y: 0.841470984807897
X: 2 , Y: 0.909297426825682
X: 3 , Y: 0.141120008059867
X: 4 , Y: -0.756802495307928
X: 5 , Y: -0.958924274663138
X: 6 , Y: -0.279415498198926
X: 7 , Y: 0.656986598718789
X: 8 , Y: 0.989358246623382
X: 9 , Y: 0.412118485241757
Today is cloudy!
Today is fine!
Today is fine!
Today is fine!
Today is fine!
Today is thundershower!
Today is cloudy!
Today is fine!
Today is fine!
Today is fine!
Today is fine!
Today is thundershower!
Today is fine!

9.new 修饰符是起什么作用?
答:
new 修饰符与 new 操作符是两个概念
new 修饰符用于声明类或类的成员,表示隐藏了基类中同名的成员。而new 操作符用于实例化一个类型
new 修饰符只能用于继承类,一般用于弥补基类设计的不足
new 修饰符和 override 修饰符不可同时用在一个成员上,因为这两个修饰符在含义上互相排斥
示例:

CODE:

using System;
using System.Collections.Generic;
using System.Text;
namespace Example09
{
class BaseClass
{
//基类设计者声明了一个PI的公共变量,方便进行运算
public static double PI = 3.1415;
}
class DervieClass : BaseClass
{
//继承类发现该变量的值不能满足运算精度,于是可以通过new修饰符显示隐藏基类中的声明
public new static double PI = 3.1415926;
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(BaseClass.PI);
Console.WriteLine(DervieClass.PI);
Console.ReadLine();
}
}
}


结果:
3.1415
3.1415926

10.this 关键字的含义?
答:
this 是一个保留字,仅限于构造函数和方法成员中使用
在类的构造函数中出现表示对正在构造的对象本身的引用,在类的方法中出现表示对调用该方法的对象的引用,在结构的构造上函数中出现表示对正在构造的结构的引用,在结构的方法中出现表示对调用该方法的结果的引用
this 保留字不能用于静态成员的实现里,因为这时对象或结构并未实例化
在 C# 系统中,this 实际上是一个常量,所以不能使用 this++ 这样的运算
this 保留字一般用于限定同名的隐藏成员、将对象本身做为参数、声明索引访问器、判断传入参数的对象是否为本身
示例:

CODE:

using System;
using System.Collections.Generic;
using System.Text;
namespace Example10
{
class Class1
{
private double c;
private string value;
public double C
{
get
{
return c;
}
}
public Class1(double c)
{
//限定同名的隐藏成员
this.c = c;
}
public Class1(Class1 value)
{
//用对象本身实例化自己没有意义
if (this != value)
{
c = value.C;
}
}
public override string ToString()
{
//将对象本身做为参数
return string.Format("{0} Celsius = {1} Fahrenheit", c, UnitTransClass.C2F(this));
}
//由于好奇,在这做了一个效率测试,想看看到底哪种方式访问成员变量更快,结论:区别不大。。。
public string Test1()
{
long vTickCount = Environment.TickCount;
for (int i = 0; i < 10000000; i++)
this.value = i.ToString();
return string.Format("Have this.: {0} MSEL", Environment.TickCount - vTickCount);
}
public string Test2()
{
long vTickCount = Environment.TickCount;
for (int i = 0; i < 10000000; i++)
value = i.ToString();
return string.Format("Don't have this.: {0} MSEL", Environment.TickCount - vTickCount);
}
}
class UnitTransClass
{
public static double C2F(Class1 value)
{
//摄氏到华氏的转换公式
return 1.8 * value.C + 32;
}
}
class Program
{
static void Main(string[] args)
{
Class1 tmpObj = new Class1(37.5);
Console.WriteLine(tmpObj);
Console.WriteLine(tmpObj.Test1());
Console.WriteLine(tmpObj.Test2());
Console.ReadLine();
}
}
}


结果:
37.5 Celsius = 99.5 Fahrenheit
Have this.: 4375 MSEL
Don't have this.: 4406 MSEL

11.可以使用抽象函数重写基类中的虚函数吗?
答:
可以,但需使用 new 修饰符显式声明,表示隐藏了基类中该函数的实现
示例:

CODE:
class BaseClass
{
public virtual void F()
{
Console.WriteLine("BaseClass.F");
}
}
abstract class DeriveClass : BaseClass
{
public new abstract void F();
}


12.密封类可以有虚函数吗?
答:
可以,基类中的虚函数将隐式的转化为非虚函数,但密封类本身不能再增加新的虚函数
示例:

CODE:

class BaseClass
{
public virtual void F()
{
Console.WriteLine("BaseClass.F");
}
}
sealed class DeriveClass : BaseClass
{
//基类中的虚函数F被隐式的转化为非虚函数
//密封类中不能再声明新的虚函数G
//public virtual void G()
//{
// Console.WriteLine("DeriveClass.G");
//}
}


13.如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有 get 和 set 两个呢?
答:
如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后也应只有一个。如果基类中有 get 和 set 两个属性访问器,那么继承类中可以只有一个也可以同时有两个属性访问器

14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
答:
abstract 修饰符不可以和 static、virtual 和 override 修饰符一起使用

15.接口可以包含哪些成员?
答:
接口可以包含属性、方法、索引指示器和事件,但不能包含常量、域、操作符、构造函数和析构函数,而且也不能包含任何静态成员

16.类和结构的区别?
答:
类:
类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存
类有构造和析构函数
类可以继承和被继承
结构:
结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。
结构没有构造函数,但可以添加。结构没有析构函数
结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口

示例:
根据以上比较,我们可以得出一些轻量级的对象最好使用结构,但数据量大或有复杂处理逻辑对象最好使用类。
如:Geoemtry(GIS 里的一个概论,在 OGC 标准里有定义) 最好使用类,而 Geometry 中点的成员最好使用结构

CODE:

using System;
using System.Collections.Generic;
using System.Text;
namespace Example16
{
interface IPoint
{
double X
{
get;
set;
}
double Y
{
get;
set;
}
double Z
{
get;
set;
}
}
//结构也可以从接口继承
struct Point: IPoint
{
private double x, y, z;
//结构也可以增加构造函数
public Point(double X, double Y, double Z)
{
this.x = X;
this.y = Y;
this.z = Z;
}
public double X
{
get { return x; }
set { x = value; }
}
public double Y
{
get { return x; }
set { x = value; }
}
public double Z
{
get { return x; }
set { x = value; }
}
}
//在此简化了点状Geometry的设计,实际产品中还包含Project(坐标变换)等复杂操作
class PointGeometry
{
private Point value;

public PointGeometry(double X, double Y, double Z)
{
value = new Point(X, Y, Z);
}
public PointGeometry(Point value)
{
//结构的赋值将分配新的内存
this.value = value;
}
public double X
{
get { return value.X; }
set { this.value.X = value; }
}
public double Y
{
get { return value.Y; }
set { this.value.Y = value; }
}
public double Z
{
get { return value.Z; }
set { this.value.Z = value; }
}
public static PointGeometry operator +(PointGeometry Left, PointGeometry Rigth)
{
return new PointGeometry(Left.X + Rigth.X, Left.Y + Rigth.Y, Left.Z + Rigth.Z);
}
public override string ToString()
{
return string.Format("X: {0}, Y: {1}, Z: {2}", value.X, value.Y, value.Z);
}
}
class Program
{
static void Main(string[] args)
{
Point tmpPoint = new Point(1, 2, 3);
PointGeometry tmpPG1 = new PointGeometry(tmpPoint);
PointGeometry tmpPG2 = new PointGeometry(tmpPoint);
tmpPG2.X = 4;
tmpPG2.Y = 5;
tmpPG2.Z = 6;
//由于结构是值类型,tmpPG1 和 tmpPG2 的坐标并不一样
Console.WriteLine(tmpPG1);
Console.WriteLine(tmpPG2);
//由于类是引用类型,对tmpPG1坐标修改后影响到了tmpPG3
PointGeometry tmpPG3 = tmpPG1;
tmpPG1.X = 7;
tmpPG1.Y = 8;
tmpPG1.Z = 9;
Console.WriteLine(tmpPG1);
Console.WriteLine(tmpPG3);
Console.ReadLine();
}
}
}


结果:
X: 1, Y: 2, Z: 3
X: 4, Y: 5, Z: 6
X: 7, Y: 8, Z: 9
X: 7, Y: 8, Z: 9

17.接口的多继承会带来哪些问题?
答:
C# 中的接口与类不同,可以使用多继承,即一个子接口可以有多个父接口。但如果两个父成员具有同名的成员,就产生了二义性(这也正是 C# 中类取消了多继承的原因之一),这时在实现时最好使用显式的声明
示例:

CODE:

using System;
using System.Collections.Generic;
using System.Text;
namespace Example17
{
class Program
{
//一个完整的接口声明示例
interface IExample
{
//属性
string P
{
get;
set;
}
//方法
string F(int Value);
//事件
event EventHandler E;
//索引指示器
string this[int Index]
{
get;
set;
}
}
interface IA
{
int Count { get; set;}
}
interface IB
{
int Count();
}
//IC接口从IA和IB多重继承
interface IC : IA, IB
{
}
class C : IC
{
private int count = 100;
//显式声明实现IA接口中的Count属性
int IA.Count
{
get { return 100; }
set { count = value; }
}
//显式声明实现IB接口中的Count方法
int IB.Count()
{
return count * count;
}
}
static void Main(string[] args)
{
C tmpObj = new C();
//调用时也要显式转换
Console.WriteLine("Count property: {0}", ((IA)tmpObj).Count);
Console.WriteLine("Count function: {0}", ((IB)tmpObj).Count());
Console.ReadLine();
}
}
}


结果:
Count property: 100
Count function: 10000

18.抽象类和接口的区别?
答:
抽象类(abstract class)可以包含功能定义和实现,接口(interface)只能包含功能定义
抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性
分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么”
为外部提供调用或功能需要扩充时优先使用接口

19.别名指示符是什么?
答:
通过别名指示符我们可以为某个类型起一个别名
主要用于解决两个命名空间内有同名类型的冲突或避免使用冗余的命名空间
别名指示符只在一个单元文件内起作用
示例:

CODE:

Class1.cs:
using System;
using System.Collections.Generic;
using System.Text;
namespace com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01
{
class Class1
{
public override string ToString()
{
return "com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01's Class1";
}
}
}


Class2.cs

CODE:

using System;
using System.Collections.Generic;
using System.Text;
namespace com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02
{
class Class1
{
public override string ToString()
{
return "com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02's Class1";
}
}
}


主单元(Program.cs):
using System;
using System.Collections.Generic;
using System.Text;
//使用别名指示符解决同名类型的冲突


CODE:

using Lib01Class1 = com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01.Class1;
using Lib02Class2 = com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02.Class1;
namespace Example19
{
class Program
{
static void Main(string[] args)
{
Lib01Class1 tmpObj1 = new Lib01Class1();
Lib02Class2 tmpObj2 = new Lib02Class2();
Console.WriteLine(tmpObj1);
Console.WriteLine(tmpObj2);
Console.ReadLine();
}
}
}


结果:
com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01's Class1
com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02's Class1

20.如何释放非托管资源?
答:
.NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资源进行释放,这时我们必须自己提供方法来释放对象内分配的非托管资源,比如你在对象的实现代码中使用了一个COM对象
最简单的办法,可以通过实现protected void Finalize()(析构函数会在编译时变成这个东东)来释放非托管资源,因为GC在释放对象时会检查该对象是否实现了 Finalize() 方法,如果是则调用它。但,据说这样会降低效率。。。
有一种更好的,那就是通过实现一个接口显式的提供给客户调用端手工释放对象的方法,而不是傻傻的等着GC来释放我们的对象(何况效率又那么低)
System 命名空间内有一个 IDisposable 接口,拿来做这事非常合适,就省得我们自己再声明一个接口了
另外补充一句,这种实现并不一定要使用了非托管资源后才用,如果你设计的类会在运行时有大些的实例(象 GIS 中的Geometry),为了优化程序性能,你也可以通过实现该接口让客户调用端在确认不需要这些对象时手工释放它们
示例:
CODE:
using System;
using System.Collections.Generic;
using System.Text;
namespace Example20
{
class Program
{
class Class1 : IDisposable
{
//析构函数,编译后变成 protected void Finalize(),GC会在回收对象前会调用调用该方法
~Class1()
{
Dispose(false);
}
//通过实现该接口,客户可以显式地释放对象,而不需要等待GC来释放资源,据说那样会降低效率
void IDisposable.Dispose()
{
Dispose(true);
}
//将释放非托管资源设计成一个虚函数,提供在继承类中释放基类的资源的能力
protected virtual void ReleaseUnmanageResources()
{
//Do something...
}
//私有函数用以释放非托管资源
private void Dispose(bool disposing)
{
ReleaseUnmanageResources();
//为true时表示是客户显式调用了释放函数,需通知GC不要再调用对象的Finalize方法
//为false时肯定是GC调用了对象的Finalize方法,所以没有必要再告诉GC你不要调用我的Finalize方法啦
if (disposing)
{
GC.SuppressFinalize(this);
}
}
}
static void Main(string[] args)
{
//tmpObj1没有手工释放资源,就等着GC来慢慢的释放它吧
Class1 tmpObj1 = new Class1();
//tmpObj2调用了Dispose方法,传说比等着GC来释放它效率要调一些
//个人认为是因为要逐个对象的查看其元数据,以确认是否实现了Dispose方法吧
//当然最重要的是我们可以自己确定释放的时间以节省内存,优化程序运行效率
Class1 tmpObj2 = new Class1();
((IDisposable)tmpObj2).Dispose();
}
}
}

21.P/Invoke是什么?
答:
在受控代码与非受控代码进行交互时会产生一个事务(transition) ,这通常发生在使用平台调用服务(Platform Invocation Services),即P/Invoke
如调用系统的 API 或与 COM 对象打交道,通过 System.Runtime.InteropServices 命名空间
虽然使用 Interop 非常方便,但据估计每次调用事务都要执行 10 到 40 条指令,算起来开销也不少,所以我们要尽量少调用事务
如果非用不可,建议本着一次调用执行多个动作,而不是多次调用每次只执行少量动作的原则

22.StringBuilder 和 String 的区别?
答:
String 虽然是一个引用类型,但在赋值操作时会产生一个新的对象,而 StringBuilder 则不会
所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String
示例:

CODE:

using System;
using System.Collections.Generic;
using System.Text;
namespace Example22
{
class Program
{
static void Main(string[] args)
{
const int cycle = 100000;
long vTickCount = Environment.TickCount;
String str = null;
for (int i = 0; i < cycle; i++)
str += i.ToString();
Console.WriteLine("String: {0} MSEL", Environment.TickCount - vTickCount);
vTickCount = Environment.TickCount;
//看到这个变量名我就生气,奇怪为什么大家都使它呢? :)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < cycle; i++)
sb.Append(i);
Console.WriteLine("StringBuilder: {0} MSEL", Environment.TickCount - vTickCount);
Console.ReadLine();
}
}
}

结果:
String: 102047 MSEL
StringBuilder: 46 MSEL

23.explicit 和 implicit 的含义?
答:
explicit 和 implicit 属于转换运算符,如用这两者可以让我们自定义的类型支持相互交换
explicti 表示显式转换,如从 A -> B 必须进行强制类型转换(B = (B)A)
implicit 表示隐式转换,如从 B -> A 只需直接赋值(A = B)
隐式转换可以让我们的代码看上去更漂亮、更简洁易懂,所以最好多使用 implicit 运算符。不过!如果对象本身在转换时会损失一些信息(如精度),那么我们只能使用 explicit 运算符,以便在编译期就能警告客户调用端
示例:
CODE:
using System;
using System.Collections.Generic;
using System.Text;
namespace Example23
{
class Program
{
//本例灵感来源于大话西游经典台词“神仙?妖怪?”--主要是我实在想不出什么好例子了
class Immortal
{
public string name;
public Immortal(string Name)
{
name = Name;
}
public static implicit operator Monster(Immortal value)
{
return new Monster(value.name + ":神仙变妖怪?偷偷下凡即可。。。");
}
}
class Monster
{
public string name;
public Monster(string Name)
{
name = Name;
}
public static explicit operator Immortal(Monster value)
{
return new Immortal(value.name + ":妖怪想当神仙?再去修炼五百年!");
}
}
static void Main(string[] args)
{
Immortal tmpImmortal = new Immortal("紫霞仙子");
//隐式转换
Monster tmpObj1 = tmpImmortal;
Console.WriteLine(tmpObj1.name);
Monster tmpMonster = new Monster("孙悟空");
//显式转换
Immortal tmpObj2 = (Immortal)tmpMonster;
Console.WriteLine(tmpObj2.name);
Console.ReadLine();
}
}
}


结果:
紫霞仙子:神仙变妖怪?偷偷下凡即可。。。
孙悟空:妖怪想当神仙?再去修炼五百年!

24.params 有什么用?
答:
params 关键字在方法成员的参数列表中使用,为该方法提供了参数个数可变的能力
它在只能出现一次并且不能在其后再有参数定义,之前可以
示例:
CODE:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class App
{
//第一个参数必须是整型,但后面的参数个数是可变的。
//而且由于定的是object数组,所有的数据类型都可以做为参数传入
public static void UseParams(int id, params object[] list)
{
Console.WriteLine(id);
for (int i = 0; i < list.Length; i++)
{
Console.WriteLine(list);
}
}
static void Main()
{
//可变参数部分传入了三个参数,都是字符串类型
UseParams(1, "a", "b", "c");
//可变参数部分传入了四个参数,分别为字符串、整数、浮点数和双精度浮点数数组
UseParams(2, "d", 100, 33.33, new double[] { 1.1, 2.2 });
Console.ReadLine();
}
}
}


结果:
1
a
b
c
2
d
100
33.33
System.Double[]

25.什么是反射?
答:
反射,Reflection,通过它我们可以在运行时获得各种信息,如程序集、模块、类型、字段、属性、方法和事件
通过对类型动态实例化后,还可以对其执行操作
一般用于插件式框架程序和设计模式的实现,当然反射是一种手段可以充分发挥其能量来完成你想做的任何事情(前面好象见过一位高人用反射调用一个官方类库中未说明的函数。。。)
示例:

CODE:

using System;
using System.Collections.Generic;
using System.Text;
namespace Example25Lib
{
public class Class1
{
private string name;
private int age;
//如果显式的声明了无参数构造函数,客户端只需要用程序集的CreateInstance即可实例化该类
//在此特意不实现,以便在客户调用端体现构造函数的反射实现
//public Class1()
//{
//}
public Class1(string Name, int Age)
{
name = Name;
age = Age;
}
public void ChangeName(string NewName)
{
name = NewName;
}
public void ChangeAge(int NewAge)
{
age = NewAge;
}
public override string ToString()
{
return string.Format("Name: {0}, Age: {1}", name, age);
}
}
}


反射实例化对象并调用其方法,属性和事件的反射调用略去

CODE:

using System;
using System.Collections.Generic;
using System.Text;
//注意添加该反射的命名空间
using System.Reflection;
namespace Example25
{
class Program
{
static void Main(string[] args)
{
//加载程序集
Assembly tmpAss = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "Example25Lib.dll");
//遍历程序集内所有的类型,并实例化
Type[] tmpTypes = tmpAss.GetTypes();
foreach (Type tmpType in tmpTypes)
{
//获取第一个类型的构造函数信息
ConstructorInfo[] tmpConsInfos = tmpType.GetConstructors();
foreach (ConstructorInfo tmpConsInfo in tmpConsInfos)
{
//为构造函数生成调用的参数集合
ParameterInfo[] tmpParamInfos = tmpConsInfo.GetParameters();
object[] tmpParams = new object[tmpParamInfos.Length];
for (int i = 0; i < tmpParamInfos.Length; i++)
{
tmpParams = tmpAss.CreateInstance(tmpParamInfos.ParameterType.FullName);
if (tmpParamInfos.ParameterType.FullName == "System.String")
{
tmpParams = "Clark";
}
}
//实例化对象
object tmpObj = tmpConsInfo.Invoke(tmpParams);
Console.WriteLine(tmpObj);
//获取所有方法并执行
foreach (MethodInfo tmpMethod in tmpType.GetMethods())
{
//为方法的调用创建参数集合
tmpParamInfos = tmpMethod.GetParameters();
tmpParams = new object[tmpParamInfos.Length];
for (int i = 0; i < tmpParamInfos.Length; i++)
{
tmpParams = tmpAss.CreateInstance(tmpParamInfos.ParameterType.FullName);
if (tmpParamInfos.ParameterType.FullName == "System.String")
{
tmpParams = "Clark Zheng";
}
if (tmpParamInfos.ParameterType.FullName == "System.Int32")
{
tmpParams = 27;
}
}
tmpMethod.Invoke(tmpObj, tmpParams);
}
//调用完方法后再次打印对象,比较结果
Console.WriteLine(tmpObj);
}
}
Console.ReadLine();
}
}
}


结果:
Name: Clark, Age: 0
Name: Clark Zheng, Age: 27


--------------------------------------------------------------------------------------------------------------------------

1. C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?
一个是这个类所代表的业务对象的属性
另一个则是这个类本身的特征
比如一个按钮控件而言
property ,就是可以直接在.aspx文件中添加的属性
attribute,通过这个可以把属性输出到html页面中的控件的属性
2. 讲一讲你理解的web service,在dot net framework中,怎么很好的结合xml?(讲概念就行了)
5. 用Visual C++ 6.0编写的代码(unmanaged code),如何在CLR下和其他dot net component结合?
转换成.net
6. 以前作过的一些项目?介绍一下自己的编程经验。(这是蒙混不过去的,基本一问就知道是真是假)
7. 你对公司有什么期望?你的薪水期望值?为什么学计算机?以前的工作经验(这非常重要)?
我只要

第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
第四,&和&&的区别。
第五,HashMap和Hashtable的区别。
第六,Collection 和 Collections的区别。
第七,什么时候用assert。
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

第十三,Java有没有goto?


第十七,给我一个你最常见到的runtime exception。
第十八,error和exception有什么区别?

第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
第二十八,编程题: 用最有效率的方法算出2乘以8等於几?
第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
第三十二,编程题: 写一个Singleton出来。

四。

数据库方面:

1. 存储过程和函数的区别
存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。
2. 事务是什么?
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为
ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:
原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须
应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数
据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

3. 游标的作用?如何知道游标已经到了最后?
游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最
后,通常此变量不等于0表示出错或到了最后。
4. 触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区
别。事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常
事前触发器可以获取事件之前和新的字段值。语句级触发器可以在语句执行前或后执行,
而行级触发在触发器所影响的每一行触发一次。
5. 存储过程的编写
6. 在一个查询中,使用哪一个关键字能够除去重复列值。
distinct
7. 什么是快照?它的作用是什么?
快照Snapshot是一个文件系统在特定时间里的镜像,对于在线实时数据备份非常有用。快照对于拥有不能停止的应用或具有常打开文件的文件系统的备份非常重要。对于只能提供一个非常短的备份时间而言,快照能保证系统的完整性。
8. 解释存储过程和触发器;
存储过程是一组 Transact-SQL 语句,在一次编译后可以执行多次。因为不必重新编
译Transact-SQL语句,所以执行存储过程可以提高性能。
触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,
以便在对特定表或列作特定类型的数据修改时执行。
9. sql server是否支持行级锁,有什么好处?
SQL Server 2000 动态地将查询所引用的每一个表的锁定粒度调整到合适的级别。当查询所引用的少数几行分散在一个大型表中时,优化数据并行访问的最佳办法是使用粒度锁,如行锁。但是,如果查询引用的是一个表中的大多数行或所有行,优化数据并行访问的最佳办法可以是锁定整个表,以尽量减少锁定开销并尽快完成查询。
SQL Server 2000 通过为每个查询中的每个表选择适当的锁定级别,在总体上优化了数
据并发访问。对于一个查询,如果只引用一个大型表中的几行,则数据库引擎可以使用行级
锁定;如果引用一个大型表的几页中的多行,则使用页级锁定;如果引用一个小型表中的所
有行,则使用表级锁定
10. 数据库日志干什么用,数据库日志满的时候再查询数据库时会出现什么情况。
每个 Microsoft&reg; SQL Server&#8482;2000 数据库都有事务日志,用以记录所有事务
和每个事务对数据库所做的修改。记录事务及其修改有三个作用:
恢复个别的事务。
如果应用程序发出 ROLLBACK 语句,或者 SQL Server 检测到错误(例如失去与客户端的通讯),就使用日志记录回滚未完成的事务所做的修改。

SQL Server 启动时恢复所有未完成的事务。
当运行 SQL Server 的服务器发生故障时,数据库可能处于这样的状态:还没有将修改从高速缓冲存储器写入数据文件,在数据文件内有未完成的事务所做的修改。当启动 SQL Server 的复本时,它对每个数据库执行恢复操作。前滚日志中记录的、可能尚未写入数据文件的每个修改。然后回滚在事务日志中找到的每个未完成的事务,以确保数据库的完整性。

将还原的数据库前滚到故障点。
丢失数据库(在没有 RAID 驱动器的服务器上,硬盘驱动器出现故障时可能会出现这种情况)后,可以将数据库还原到故障点。首先还原上一次的完整数据库备份或差异数据库备份,然后将事务日志备份序列还原到故障点。当还原每个日志备份时,SQL Server 重新应用日志中记录的所有修改以前滚所有事务。当最后的日志备份还原后,SQL Server 将使用日志信息回滚到该点未完成的所有事务。
11. 备份时,应用程序是否可以并行?为何?
可以;设计要求如此;不同DBMS均有对此的多种支持系统,如日志、事务等公有的和一些专有的~
12. 部分恢复完成后,数据库是否立即可用?为何?
不可;恢复截断点~
13. 容灾和备份的区别?
主要在逻辑与物理、抽象与具体的差异
14. 表结构如下:
列名 数据类型 长度 允许为空
id int 4 是
test varchar 50 是
Rank int 4 是

数据内容如下:
id test Rank
1 Hello 1
1 Mr 2
1 King 3
2 I 1
2 am 2
2 Best 4
2 The 3

查询结果如下:

id test
1 Hello Mr King
2 I am The Best

create table t(id int,test varchar(50),Rank int)
insert into t select 1,'Hello',1
insert into t select 1,'Mr',2
insert into t select 1,'King',3
insert into t select 2,'I',1
insert into t select 2,'am',2
insert into t select 2,'Best',4
insert into t select 2,'The',3


create function f_str(@psid int)
returns varchar(8000)
as
begin
declare @ret varchar(8000)
set @ret = ''
select @ret=@ret + test + ' ' from t where id=@psid order by Rank
return @ret
end
go

select distinct id, name=dbo.f_str(id) from t group by id

create table t
(id int,test varchar(50),Rank int)

insert t
select 1,'Hello',1 union all
select 1,'Mr',2 union all
select 1,'King',3 union all
select 2,'I',1 union all
select 2,'am',2 union all
select 2,'Best',4 union all
select 2,'The',3
go
create function f_union(@id int)
returns varchar(100)
as
begin
declare @sql varchar(100)
set @sql=''
select @sql=@sql+' '+test from t where id=@id order by Rank
return(stuff(@sql,1,1,''))
end
go

select id,dbo.f_union(id) as test from t group by id

drop table t

id test
------------- ---------------------------
1 Hello Mr King
2 I am The Best

(所影响的行数为 2 行)

--测试表
create table #tb(id int,test varchar(50),rank int)
create table #tb1(id int,test varchar(1000))
insert #tb values(1,'hello',1)
insert #tb values(1,'Mr',2)
insert #tb values(1,'King',3)
insert #tb values(2,'I',1)
insert #tb values(2,'am',2)
insert #tb values(2,'Best',4)
insert #tb values(2,'The',3)

--查询
declare @id int
declare @i int
declare @cnt int
declare @char varchar(1000)
declare cur cursor for
select distinct id from #tb
open cur
fetch next from cur into @id
while (@@fetch_status =0)
begin
set @char=''
select @cnt=count(*) from #tb where id=@id
set @i=1
while @i<=@cnt
begin
select @char=@char +test + ' ' from #tb where id=@id and rank =@i
set @i=@i+1
end
insert #tb1 values(@id,@char)
fetch next from cur into @id
end

close cur
deallocate cur
select * from #tb1

--删除测试表
drop table #tb1
drop table #tb

--结果
id test

1hello Mr King
2I am The Best


Q:软件开发过程一般有几个阶段?每个阶段的作用?
Q:微软推出了一系列的Application Block,请举出您所知道的Application Block并说明其作用?
Q:请列举一些您用到过的设计模式以及在什么情况下使用该模式?
Q:您对WebService的体会?
Q:您对编程的兴趣如何?工作中遇到不懂的问题是怎样去解决的?您一般怎样去提高自己的编程水平?
Q:您离职的原因是什么?
Q:通过超链接怎样传递中文参数?

八。

1.有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.
2.如果需记录类的实例个数,该如何实现,请写一个简单的类于以证明.
3.A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函数的执行过程.
4.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.

二.简答题
1.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令 和语句 new 创建实例 new 隐藏基类中方法
4.谈谈类和结构的区别?类是引用类型、结构是值类型

6.对于这样的一个枚举类型:
enum Color:byte{
Red,
Green,
Blue,
Orange
}
string[] ss=Enum.GetNames(typeof(Color));
byte[] bb=Enum.GetValues(typeof(Color));
试写一段程序显示出枚举类型中定义的所有符号名称以及它们对应的数值。
7.您了解设计模式么?请列出您所知道的设计模式的名称。 //
8.请在SQL Server中设计表来保存一个树状结构的组织结构图(假设结构图中只有名称这一项内容需要保存),如果我想查询某一职位下的所有职位,用一个存储过程来实现,你有什么思路?


10.下面这段代码输出什么?为什么?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");
//不相等,因为比较的是对象

1.写一个实现对一段字符串翻转的方法,附加一些条件,如其中包括“,”、“.”,对其设计测试用 例 。
2.对一支纸杯设计测试用例(可以是广义的杯,不一定是某一支特定功能的杯)
开发语言概念题
7.链表和数组的区别,各有什么优缺点.
8.Remoting在客户端服务器怎么实现 ?
9.什么是友元函数?

10.用标准C如何实现多态?


英语题
14.用英文介绍一下使用C#/C++做的项目,主要功能
15.如果要与美国开电话会议,会如何与美国的工程师沟通
16.如果老板认为你的技术落后,你会怎么回答

数据库知识题
17.使用什么工具来调用存储过程
18.SQL Server的两种索引是何形式?索引的作用?索引的优缺点?
answer:
sql server的索引分为聚集索引和非聚集索引,下面分别说明:
聚集索引
聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。
只有当表包含聚集索引时,表中的数据行才按排序顺序存储。如果表具有聚集索引,则该表称为聚集表。如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中
非聚集索引
非聚集索引具有独立于数据行的结构。非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。
从非聚集索引中的索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页是存储在堆中还是聚集表中。对于堆,行定位器是指向行的指针。对于聚集表,行定位器是聚集索引键。
索引的作用主要是为了在查询时提高查询的效率,并且尽量减小更新时的开销。
优点:
设计良好的索引查询效率可以得到极大的提高,某些情况下甚至可以提高几百上千倍。
缺点:
需要占用额外的空间和资源。在更新时耗费的时间更大,因为对数据的更新很有可能会导致索引的更新,这样就会导致增加系统开销。
点评:
在所有的进行系统优化的选择中,索引都是第一位的,一个设计良好的数据库肯定需要高超的索引设计技巧,在这方面效率提高不是一倍两倍的问题,而是可能会有质的飞跃,对索引优化的重要性,在一个大型项目里,怎么说都不为过。但是,索引优化又是比较困难的,哪些列需要加入索引,列的顺序怎样,哪个索引需要设置为聚集索引等等,都是我们必须要考虑的问题。

其它知识题及问题
20.什么是Web Service?
21.什么是XML?
22.Socket怎么实现?

-----------------------------------------------

二。

Q7:描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
Q8:C#中要使一个类支持FOREACH遍历,实现过程怎样?
Q11:你对XMLHTTP、WEBSERVICE 了解吗?简单描述其特点、作用
Q1
Q13:自定义控件和一般用户控件的异同?如果要用这两者之一,你会选择哪种?为什么
Q14:大概描述一下ASP。NET服务器控件的生命周期
Q15:UML
Q17:类划分的依据。类粒度问题
Q18:事物管理问题

三。

第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
第四,&和&&的区别。
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

四。

数据库方面:


---------------------------------------------------------
一组asp.net面试题附答案

11.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
答:一般为3层
数据访问层,业务层,表示层。
数据访问层对数据库进行增删查改。
业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。
表示层为了与用户交互例如用户添加表单。
优点:
分工明确,条理清晰,易于调试,而且具有可扩展性。
缺点:
增加成本。

12.在下面的例子里
using System;
class A{
public A(){
PrintFields(); }
public virtual void PrintFields(){}
}
class B:A{
int x=1;
int y;
public B(){
y=-1; }
public override void PrintFields(){
Console.WriteLine("x={0},y={1}",x,y); }
当使用new B()创建B的实例时,产生什么输出?
答:X=1,Y=0;x= 1 y = -1

28.SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号
答:Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)

回复:一组asp.net面试题附答案
31.公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行 (排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的思路
答:根据点击的列头,包该列的ID取出,按照该ID排序后,在给绑定到ListView中。

33.写出一条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)

34.面向对象的语言具有________性、_________性、________性
答:封装、继承、多态。

35.能用foreach遍历访问的对象需要实现 ___IEnumerable_____________接口或声明________GetEnumerator________方法的类型。
答:IEnumerable 、 GetEnumerator。

61.产生一个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=(int)myList;

-----------------------------------------------------------

几组 c# 面试题目
一、选择填空题(每空2分,共60分)
1.在对SQL Server 数据库操作时应选用(a)。
a)SQL Server .NET Framework 数据提供程序;
b)OLE DB .NET Framework 数据提供程序;
c)ODBC .NET Framework 数据提供程序;
d)Oracle .NET Framework数据提供程序;

2.下列选项中,(c)是引用类型。
a)enum类型
b)struct类型
c)string类型
d)int类型

3.关于asp.net中的代码隐藏文件的描述正确的是(d)
a)Web窗体页的程序的逻辑由代码组成,这些代码的创建用于与窗体交互。编程逻辑唯一与用户界面不同的文件中。该文件称作为“代码隐藏”文件,如果用C#创建,该文件将具有“.ascx.cs”扩展名。
b)项目中所有Web窗体页的代码隐藏文件都被编译成.EXE文件。
c)项目中所有的Web窗体页的代码隐藏文件都被编译成项目动态链接库(.dll)文件。
d)以上都不正确。

4.以下描述错误的是(a)
a)在C++中支持抽象类而在C#中不支持抽象类。
b)C++中可在头文件中声明类的成员而在CPP文件中定义类的成员,在C#中没有头文件并且在同一处声明和定义类的成员。
c)在C#中可使用 new 修饰符显式隐藏从基类继承的成员。
d)在C#中要在派生类中重新定义基类的虚函数必须在前面加Override。

5.C#的数据类型有(b)
a)值类型和调用类型;
b)值类型和引用类型;
c)引用类型和关系类型;
d)关系类型和调用类型;

6.下列描述错误的是(c)
a)类不可以多重继承而接口可以;
b)抽象类自身可以定义成员而接口不可以;
c)抽象类和接口都不能被实例化;
d)一个类可以有多个基类和多个基接口;

7.在DOM中,装载一个XML文档的方法(b)
a)save方法
b)load方法
c)loadXML方法
d)send方法

8.下列关于构造函数的描述正确的是(c)
a)构造函数可以声明返回类型。
b)构造函数不可以用private修饰
c)构造函数必须与类名相同
d)构造函数不能带参数

9.以下是一些C#中的枚举型的定义,其中错误的用法有()
a)public enum var1{ Mike = 100, Nike = 102, Jike }
b)public enum var1{ Mike = 100, Nike, Jike }
c)public enum var1{ Mike=-1 , Nike, Jike }
d)public enum var1{ Mike , Nike , Jike }

10.int[][] myArray3=new int[3][]{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}}; myArray3[2][2]的值是()。
a)9
b)2
c)6
d)越界

11.接口是一种引用类型,在接口中可以声明(a),但不可以声明公有的域或私有的成员变量。
a)方法、属性、索引器和事件;
b)方法、属性信息、属性;
c)索引器和字段;
d)事件和字段;

12.ASP.NET框架中,服务器控件是为配合Web表单工作而专门设计的。服务器控件有两种类型,它们是( a)
a)HTML控件和Web控件
b)HTML控件和XML控件
c)XML控件和Web控件
d)HTML控件和IIS控件

13.ASP.NET中,在Web窗体页上注册一个用户控件,指定该控件的名称为”Mike”,正确的注册指令为(b )
a)<%@Register TagPrefix = “Mike” TagName = “Space2” Src = “myX.ascx”%>
b)<%@Register TagPrefix = “Space2” TagName = “Mike” Src = “myX.ascx”%>
c)<%@Register TagPrefix = “SpaceX” TagName = “Space2” Src = “Mike”%>
d)以上皆非

14.在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是(a)。
a)insert、update、delete等操作的Sql语句主要用ExecuteNonQuery()方法来执行;
b)ExecuteNonQuery()方法返回执行Sql语句所影响的行数。
c)Select操作的Sql语句只能由ExecuteReader()方法来执行;
d)ExecuteReader()方法返回一个DataReder对象;

15.下列ASP.NET语句(b)正确地创建了一个与SQL Server 2000数据库的连接。
a)SqlConnection con1 = new Connection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);
b)SqlConnection con1 = new SqlConnection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);
c)SqlConnection con1 = new SqlConnection(Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB);
d)SqlConnection con1 = new OleDbConnection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);

16.Winform中,关于ToolBar控件的属性和事件的描述不正确的是(d)。
a)Buttons属性表示ToolBar控件的所有工具栏按钮
b)ButtonSize属性表示ToolBar控件上的工具栏按钮的大小,如高度和宽度
c)DropDownArrows属性表明工具栏按钮(该按钮有一列值需要以下拉方式显示)旁边是否显示下箭头键
d)ButtonClick事件在用户单击工具栏任何地方时都会触发

17.在ADO.NET中执行一个存储过程时,如果要设置输出参数则必须同时设置参数的方向和(d?? ),必要时还要设置参数尺寸。
a)大小;
b)上限;
c)初始值;
d)类型;

18.如果将窗体的FormBoderStyle设置为None,则( c???)。
a)窗体没有边框并不能调整大小;
b)窗体没有边框但能调整大小;
c)窗体有边框但不能调整大小;
d)窗体是透明的;

19.如果要将窗体设置为透明的,则(b )
a)要将FormBoderStyle属性设置为None;
b)要将Opacity属性设置为小于100%得值;
c)要将locked 属性设置为True;
d)要将 Enabled属性设置为True;

20.下列关于C#中索引器理解正确的是(d )
a)索引器的参数必须是两个或两个以上
b)索引器的参数类型必须是整数型
c)索引器没有名字
d)以上皆非

21.下面描述错误的是( c)。
a)窗体也是控件;
b)窗体也是类;
c)控件是从窗体继承来的;
d)窗体的父类是控件类;

22.要对注册表进行操作则必须包含( d??)。
a)System.ComponentModel命名空间;
b)System.Collections命名空间;
c)System.Threading命名空间;
d)Microsoft.Win32命名空间;

23.要创建多文档应用程序,需要将窗体的(d )属性设为true。
a)DrawGrid;
b)ShowInTaskbar;
c)Enabled;
d)IsMdiContainer;

24.如果设treeView1=new TreeView(),则treeView1.Nodes.Add("根节点")返回的是一个 (a)类型的值。
a)TreeNode;
b)int;
c)string;
d)TreeView;

25.下面关于XML的描述错误的是()。
a)XML提供一种描述结构化数据的方法;
b)XML 是一种简单、与平台无关并被广泛采用的标准;
c)XML文档可承载各种信息;
d)XML只是为了生成结构化文档;

26. 以下的C#代码,试图用来定义一个接口:
public interface IFile
{
int A;
int delFile()
{
A = 3;
}
void disFile();
}
关于以上的代码,以下描述错误的是(b )。
a)以上的代码中存在的错误包括:不能在接口中定义变量,所以int A代码行将出现错误;
b)以上的代码中存在的错误包括:接口方法delFile是不允许实现的,所以不能编写具体的实现函数;
c)代码void disFile();声明无错误,接口可以没有返回值;
d)代码void disFile();应该编写为void disFile(){};

27.在ASP.NET中有Button控件myButton,要是单击控件时,导航到其他页面http://www.aspx1.com, 正确的代码为( )。
a)private void myButton_Click(object sender, System.EventArgs e){Redirect(“http://www.aspx1.com”);}
b)private void myButton_Click(object sender, System.EventArgs e){Request.Redirect(“http://www.aspx1.com”);}
c)private void myButton_Click(object sender, System.EventArgs e){Reponse.Redirect(“http://www.aspx1.com”);}
d)private void myButton_Click(object sender, System.EventArgs e){Request.Redirect(“http://www.aspx1.com”);return true;}

28.XML文档既包含数据同时也可包含( )。
a)元数据;
b)架构;
c)代码;
d)图片;

29.在C#中利用Socket进行网络通信编程的一般步骤是:建立Socket侦听、( b)、利用Socket接收和发送数据。
a)建立Socket连接;
b)获得端口号;
c)获得IP地址;
d)获得主机名;

30.声明一个委托public delegate int myCallBack(int x); 则用该委托产生的回调方法的原型应该是(a )。
a)void myCallBack(int x) ;
b)int receive(int num) ;
c)string receive(int x) ;
d)不确定的;

二、判断题,对的打√错的打×(每小题2分,共20分)
1.( 1)在C#中,装箱操作是将值类型转化成引用类型。

2.(1 )接口中的成员不可以有访问域修饰符,但可以有其它修饰符。

3.( )在C#中,索引器是专门用来访问对象中的数组信息的。

4.(1 )在C#中,接口可以被多重继承而类不能。

5.( )在C#中,int[][]是定义一个int型的二维数组。

6.( 0)异常类对象均为System.Exception类的对象。

7.(1 ) 当窗体最小化后,再次还原成为活动窗体时将自动触发Paint事件。

8.( 1) ASP.NET中,使用验证控件来验证用户输入,要求用户不可跳过该项输入,并且用户输入值在0和1000之间,则适用RequiredFieldValidator和RangeValidator控件。

9.( 1) 声明委托实际上是声明了一个方法。

10.( 1) 任何事物都是对象。
三、简述题(每小题10分,共20分)
1.请简述一下用Socket进行同步通讯编程的详细步骤

2. 比较ADO 与ADO.NET 的不同。

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


简答题2.答案
ADO与ADO.NET既有相似也有区别,他们都能够编写对数据库服务器中的数据进行访问和操作的应用程序,并且易于使用、高速度、低内存支出和占用磁盘空间较少,支持用于建立基于客户端/服务器和 Web 的应用程序的主要功能。但是ADO使用OLE DB接口并基于微软的COM技术,而ADO.NET拥有自己的ADO.NET接口并且基于微软的.NET体系架构。众所周知.NET体系不同于COM体系,ADO.NET接口也就完全不同于ADO和OLE DB接口,这也就是说ADO.NET和ADO是两种数据访问方式。
aspx1 最后编辑于 2008-01-24 08:16:57
http://www.Aspx1.Com
请帮忙宣传Aspx1 , Aspx1是ASP.NET学习者的家园 , 适宜长期居住.
TOP
积分不够,无法下载资源,快来这里快速获取积分(金币)!
发送短消息

一.填空题
1.c#中的三元运算符是_____?
2.当整数a赋值给一个object对象时,整数a将会被_____?
3.类成员有_____种可访问形式?
4.public static const int A=1;这段代码有错误么?是什么?
5.float f=-123.567F;
int i=(int)f;
i的值现在是_____?
6.利用operator声明且仅声明了==,有什么错误么?
7.委托声明的关键字是______?
9.在Asp.net中所有的自定义用户控件都必须继承自________?
10.在.Net中所有可序列化的类都被标记为_____?
11.在.Net托管代码中我们不用担心内存漏洞,这是因为有了______?
12.下面的代码中有什么错误吗?_______
using System;
class A
{
public virtual void F(){
Console.WriteLine("A.F");
}
}
abstract class B:A
{
public abstract override void F();
}

13.当类T只声明了私有实例构造函数时,则在T的程序文本外部,______(可以 or 不可以)从T派生出新的类,____(可以 or 不可以)直接创建T的任何实例。

二.简答题

2.在下面的例子里
using System;
class A
{
public A(){
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B(){
y=-1;
}
public override void PrintFields(){
Console.WriteLine("x={0},y={1}",x,y);
}
当使用new B()创建B的实例时,产生什么输出?

3.下面的例子中
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);
}
}
产生的输出结果是什么?

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

6.对于这样的一个枚举类型:
enum Color:byte{
Red,
Green,
Blue,
Orange
}
试写一段程序显示出枚举类型中定义的所有符号名称以及它们对应的数值。

7.您了解设计模式么?请列出您所知道的设计模式的名称。

8.请在SQL Server中设计表来保存一个树状结构的组织结构图(假设结构图中只有名称这一项内容需要保存),如果我想查询某一职位下的所有职位,用一个存储过程来实现,你有什么思路?

9.什么叫做SQL注入,如何防止?请举例说明。

10.下面这段代码输出什么?为什么?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");

1 ?:
2 装箱
3 3种
4 const成员都是static所以应该去掉static
5 -123
6 要同时修改Equale和GetHash() ? 重载了"==" 就必须重载 "!="
7 delegate
8 不可被继承
9 System.Web.UI.UserControl
10 [serializable]
11 gC
12 abstract override 是不可以一起修饰
13 不可以,不可以
14 case():不行 default;
15 可以

1 Using 引入一个名子空间,或在使用了一个对像后自动调用其IDespose,New 实例化一个对

像,或修饰一个方法,表此方法完全重写此方法,
2 X=1,Y=0
3 x=1,y=2
4 最大区别一个是引用类型,一个是值类型 默认成员访问为public是另外一个区别。

14.概述三层结构体系
web/business/dataaccess

15.asp.net如何实现MVC模式,举例说明!
web/business/dataaccess

1.面向对象的思想主要包括什么?
答:....

8.C#中的接口和类有什么异同。
答:
区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。
区别二,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。
区别三,继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。
区别四,在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。
接口相对于抽象类的优势:
好处一,接口不光可以作用于引用类型,也可以作用于值类型。而抽象类来说,只能作用于引用类型。
好处二,.Net的类型继承只能是单继承的,也就是说一个类型只能继承一个类型,而可以继承多个接口。
好处三,由于接口只是定义属性和方法,而与真正实现的类型没有太大的关系,因此接口可以被多个类型重用。相对于此,抽象类与继承类的关系更紧密些。
好处四,通过接口,可以减少类型暴露的属性和方法,从而便于保护类型对象。
好处五,减少值类型的拆箱操作。
相对于抽象类来说,接口有这么多好处,但是接口有一个致命的弱点,就是接口所定义的方法和属性只能相对于继承它的类型(除非在继承类中修改接口定义的函数标示),那么对于多层继承关系的时候,光用接口就很难实现。

12.进程和线程分别怎么理解?
答:简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

14.活动目录的作用。
答:活动目录包括两个方面:目录和与目录相关的服务。目录是存储各种对象的一个物理上的容器,从静态的角度来理解这活动目录与我们以前所结识的“目录”和“文件夹”没有本质区别,仅仅是一个对象,是一实体;而目录服务是使目录中所有信息和资源发挥作用的服务,活动目录是一个分布式的目录服务,信息可以分散在多台不同的计算机上,保证用户能够快速访问,因为多台机上有相同的信息,所以在信息容氏方面具有很强的控制能力,正因如此,不管用户从何处访问或信息处在何处,都对用户提供统一的视图。

20.常用的调用webservice方法有哪些?
答:通过Web 服务引用,在本地生成所要调用服务的类...等

2、讲一讲你理解的web service,在dot net framework中,怎么很好的结合xml?(讲概念就行了)

从表面上看,Web Service就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web调用来实现某个功能的应用程序。从深层次上看,Web Service是一种新的Web应用程序分支,它们是自包含、自描述、模块化的应用,可以在网络(通常为Web)中被描述、发布、查找以及通过Web来调用。可扩展的标记语言XML是Web Service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既与平台无关,又与厂商无关。XML是由万维网协会(W3C)创建,W3C制定的XML SchemaXSD定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。Web Service平台是用XSD来作为数据类型系统的。当你用某种语言如VB.NET或C#来构造一个Web Service时,为了符合Web Service标准,所有你使用的数据类型都必须被转换为XSD类型。如想让它使用在不同平台和不同软件的不同组织间传递,还需要用某种东西将它包装起来。这种东西就是一种协议,如 SOAP。

3. C#, Java 和 c++的特点,有什么相同的地方,不同的地方,C#分别从c++和java中吸取了他们那些优点?
C#看起来与Java有着惊人的相似;它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的 过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成。
微软c#语言定义主 要是从C和C++继承而来的,而且语言中的许多元素也反映了这一点.C#在设计者从C++继承的可选选项方面比Java要广泛一些(比如说 structs),它还增加了自己新的特点(比方说源代码版本定义).

C#从Java继承而来的特点

类:在C#中类的申明与Java很相似。特点看起来与Java相比没有变化.布尔运算:条件表达式的结果是布尔数据类型,布尔数据类型是这种语言中独立的一种数据类型.从布尔类型到其他类型没有 直接的转换过程.布尔常量true和false是C#中的关键字.错误处理:如Java中那样,通过抛出和捕捉异常对象来管理错误处理过程.内存管理:由 底层.NET框架进行自动内存垃圾回收.

C#从C和C++继承的特点

编译:程序直接编译成标准的二进制可执行形式.

结构体:一个C#的结构体与C++的结构体是相似的,因为它能够包含数据申明和方法.但是,不象C++,C#结构体与类是不同的而且不支持继承.但是,与Java相同的是,一个结构体可以实现界面.
预编译:C#中存在预编译指令支持条件编译,警告,错误报告和编译行控制. #error

C#独有的特点
中间代码:微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地.微软公司很小心的声称MSIL不是解释性的,而是被编译成了机器码.它也明 白许多--如果不是大多数的话--程序员认为Java程序要不可避免的比C编写的任何东西都要慢.而这种实现方式决定了基于MSIL的程序(指的是用 C#,Visual Basic,"Managed C++"--C++的一个符合CLS的版本--等语言编写的程序)将在性能上超过"解释性的"Java代码.当然,这一点还需要得到事实证明,因为C#和 其他生成MSIL的编译器还没有发布.但是Java JIT编译器的普遍存在使得Java和C#在性能上相对相同.象"C#是编译语言而Java是解释性的,"之类的声明只是商业技巧.Java的中间代码和 MSIL都是中间的汇编形式的语言,它们在运行时或其它的时候被编译成机器代码.

命名空间中的申明:当你创建一个程序的时候,你在一个命名空间里创建了一个或多个类.同在这个命名空间里(在类的外面)你还有可能声明界面,枚举类型和结构体.必须使用using关键字来引用其他命名空间的内容.
基本的数据类型:C#拥有比C,C++或者Java更广泛的数据类型.这些类型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.象Java一样,所有这些类型都有一个固定的大小.又象C和C++一样,每个数据类型都有有符号和无符号两种类型.与 Java相同的是,一个字符变量包含的是一个16位的Unicode字符.C#新的数据类型是decimal数据类型,对于货币数据,它能存放28位10 进制数字.

两个基本类:一个名叫object的类是所有其他类的基类.而一个名叫string的类也象object一样是这个语言的一部分.作为语言的一部分存在意味着编译器有可能使用它--无论何时你在程序中写入一句带引号的字符串,编译器会创建一个string对象来保存它.
参数传递:方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递.ref关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值.out关键字也能声明引用传递过程,与ref不同的地方是,它指明这个参数并不需要初始值.
与COM 的集成:C#对Windows程序最大的卖点可能就是它与COM的无缝集成了,COM就是微软的Win32组件技术.实际上,最终有可能在任何.NET语 言里编写COM客户和服务器端.C#编写的类可以子类化一个以存在的COM组件;生成的类也能被作为一个COM组件使用,然后又能使用,比方说, JScript语言子类化它从而得到第三个COM组件.这种现象的结果是导致了一个运行环境的产生,在这个环境里的组件是网络服务,可用用任何.NET语 言子类化.
索引下标:一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就象用数组下标一样)以外是相似的.
代理和反馈:一个代理对象包括了访问一个特定对象的特定方法所需的信息.只要把它当成一个聪明的方法指针就行了.代理对象可以被移动到另一个地方,然后可以 通过访问它来对已存在的方法进行类型安全的调用.一个反馈方法是代理的特例.event关键字用在将在事件发生的时候被当成代理调用的方法声明中.


5、ADO.NET相对于ADO等主要有什么改进?
ADO以Recordset存储,而ADO.NET则以DataSet表示。Recordset看起来更像单表,如果让Recordset以多表的方式表示就必须在SQL中进行多表连接。反之,DataSet可以是多个表的集合。ADO 的运作是一种在线方式,这意味着不论是浏览或更新数据都必须是实时的。ADO.NET则使用离线方式,在访问数据的时候ADO.NET会利用XML制作数据的一份幅本,ADO.NET的数据库连接也只有在这段时间需要在线。

由于ADO使用COM技术,这就要求所使用的数据类型必须符合COM规范,而ADO.NET基于XML格式,数据类型更为丰富并且不需要再做COM编排导致的数据类型转换,从而提高了整体性能。

9、公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行 (排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的思路:(10)
答:根据点击的列头,包该列的ID取出,按照该ID排序后,在给绑定到ListView中

10、给定以下XML文件,完成算法流程图。(10)
<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 );
}
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Neusoft06

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值