面试题

1.string 和 stringbuilder的区别

string a="1"; //这一句是在内存中分配了一个空间,或者更专业的说法,是在堆中创建了一个a对象;
a="2"; //这一句又在内存中分配了一个空间,或者更专业的说法,又在堆中创建了一个a对象;
  //原来的a对象作废(即没有指向),以后作为垃圾回收
所以说频繁的操作string理论上来说是非常耗开销的!!

而StringBuilde不存在这个问题,例如:
StringBuilder a = "1"; //在堆中创建了一个对象a!!
a = "2"; //继续使用堆中的a对象,
  //这两条只使用堆中的一个对象

2.string str = null 与 string str = “”

string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间.

3.请详述在dotnet中类(class)与结构(struct)的异同

Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的.

 

4.分析以下代码,完成填空(10分)
string strTmp = "abcdefg某某某";
int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;
int j= strTmp.Length;
以上代码执行完后,i= j=
答:i=13,j=10

 

5.根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。

public void test(int i) 


lock(this

if (i>10



i
--

test(i); 

}
 

}
 

}
 


不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)


6.简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用

WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。

 

7.聚集索引和非聚集索引

聚集索引时物理排序
非聚集索引是按照物理和逻辑排序
你可以把索引理解为字典
聚集索引直接查询到子 
非聚集索引则需要先查偏旁或者拼音再查字

 

首先说一个容易理解错误的点,聚集索引说的按照物理上的顺序组织,并不是指得在磁盘上就按照顺序存储,这里不进一步解释,通过后面的叙述你能慢慢理解到,但同学你可以想想,如果物理上按照这种顺序存储哪里来这么多顺序的空闲空间,一旦插入数据的时候又怎么移动原有的数据。

数据都是存储到数据页上的,就像书本的目录一样利用索引去查找书本内容,相信你能理解和想象得到索引就一系列的键值树,这里就出现了两种类型的键值树,就是你说的聚集索引和非聚集索引。

聚集索引最关键的是树的最后一层,那里就是数据,包括了你所知道的所有的列,也就是说找到了最后一层就是数据,你的任务也就完成了;前面所说的按照物理顺序存储是指的数据页之间通过一种双向的页面链来链接,当然顺序就是键值的顺序,这样插入数据的时候你可以修改链来实现。因为SQL中页是一种用来存储数据的单位,所以说成物理的顺序也不为过,更进一步来说,对于一个表,不能实现多于一个的页面链,因此一个表就只能有一个聚集索引(这个很容易理解,你画画图就知道)。

而非聚集索引最后一层不是数据,而是一个被叫做书签的东西(bookmark),这个书签是什么呢?如果表中有聚集索引,那么这个书签保存的就是聚集索引的键值,有了这个聚集索引的键值,就可以再去遍历聚集索引最后找到你要的数据,可以看出,这样是没有聚集索引效率的,但没办法啊,谁叫一个表就只能有一个聚集索引呢,就只能采取这种间接的办法! 另外,如果表中没有聚集索引怎么办,通常把这种数据叫做堆(同学可以理解成乱麻麻的一堆),如果在堆上建一个非聚集索引的话,书签里就是装的数据行的标示,格式大概就是这样:文件号:页号:槽号。总的来说非聚集索引是一种间接的查找。

值得一提的是,在聚集索引的表上建立非聚集索引,你可以想象一下,要找到一个数据是一个迂回的路径,如果给定的查询条件搜索范围不够窄,它的效率不一定有扫描整个表来的快,因此你查询计划中惊奇的发现SQL用表扫描代替索引查找,关于这些查询计划的问题,你可以有一定基础之后去阅读一些资料!

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

 

9、写出一条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)

 

10、请编程实现一个冒泡排序算法?
答:
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 ;
}
}
}

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

 

12、一列数的规则如下: 112358132134...... 求第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);
}
}

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


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

 

15、








posted @ 2011-04-25 14:06  awp110  阅读(168)  评论(0编辑  收藏  举报