思维的乐趣

Enjoy it
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

几道.NET笔试题

Posted on 2010-06-11 15:41  szh114  阅读(859)  评论(2编辑  收藏  举报

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 或者其它的控件所代替了。因此我在学习过程中也没注意这个控件,这道大题就没答上。。。