1:一个10个元素的排好序的线性表,使用2分法进行查找,最坏情况下需要比较多少次?
答:4次,就10个元素,自己数一下就出来啦。
2:说说IDisposable接口的大概功用。
3:接口可以有哪些类型的成员,不可以有哪些类型的成员。
答:CLR允许接口可以包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。但是注意:C#中不能包含任何静态成员。
4:一个用户自定义的Exception类需要继承自哪个类?
答: ApplicationException 类。
5:用SQL语句从一个表中查出所有有重复记录的记录。
答: SELECT * FROM A GROUP BY COLUMA,COLUMB,COLUMC HAVING(COUNT(*))>1 (按表的所有列进行GROUP BY)
6:概述 IsPostBack 的作用。
7:C#中接口跟抽象类的异同,概述面向接口编程的优势。
答:接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。但是注意:C#中不能包含任何静态成员。一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。
抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象方法由overriding方法来实现。
细节需参考:[你必须知道的.NET] 第二回:对抽象编程:接口和抽象类
8:概述反射 跟 序列化 。
9:根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
public void test(int i)
{
lock (this)
{
if (i > 10)
{
Console.WriteLine(i);
i--;
test(i);
}
}
}
我以前见过这道题,也记得答案但没有细看,因此昨天就只写了个不会。。。。。当时想的是看到线程并发之类细节内容时再看。。。结果杯具了。真考到了。。。
网上答案是:不会发生死锁,(int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)
我先试了下int,确实不会死锁。然后我又换了引用型的 string做测试,代码如下:
public void test(string s)
{
lock (this)
{
if (s.Length > 10)
{
Console.WriteLine(s);
s = s.Remove(s.Length - 1);
test(s);
}
}
}
结果还是没有死锁!!!!!!!!!是不是因为每次做s = s.Remove(s.Length - 1);时s中存放的string地址都变化了,所以不会锁呢?于是我把这句删除了又试,但是为了防止无限递归,我加了一个静态变量做退出条件。
static int i = 0;
public void test(string s)
{
i++;
lock (this)
{
if (s.Length > 10)
{
Console.WriteLine(s);
if (i > 10)
{
return;
}
//s = s.Remove(s.Length - 1);
test(s);
}
}
}
问题是:还是没有死锁。。。。。既然前面提到了引用型
死锁,在这儿应该讲的是资源独占锁定,而别的对象无法访问,而在这儿,看样子好像是它自身把对象锁了,然后又等待调用自身,那应该会死锁,但事实上没有。所以我有必要探究一下这个lock(this)倒底lock住了什么东西!
看MSDN:
The lock keyword marks a statement block as a critical section by obtaining the mutual-exclusion lock for a given object, executing a statement, and then releasing the lock. This statement takes the following form:
Object thisLock = new Object();
lock (thisLock)
{
// Critical code section.
}
The lock keyword ensures that one thread does not enter a critical section of code while another thread is in the critical section. If another thread tries to enter a locked code, it will wait, block, until the object is released.
由此可见,lock锁资源,是以线程为单位来锁的,只是防止别的线程访问某些资源,而将这些资源排他锁定,但是在上面的题目中,即使递归访问了自身,那也仍然在一个线程的范围之内,当然不存在死锁的问题了!!!
10: string s=null; 跟 string s="";有什么区别?
11: 请简述 DataGrid 控件绑定显示数据的主要操作步骤。
这道也杯具了。。。毕竟DataGrid 是.NET 1.1 时代就发布的数据绑定显示功能,在.NET2.0以后就逐渐被GridView 或者其它的控件所代替了。因此我在学习过程中也没注意这个控件,这道大题就没答上。。。