C#面试题(设计模式在后面)2.const和readonly有什么区别?答:const可以用于类的成员常量和局部常量,必须在声明时赋值,之后不可以对常量进行赋值。而readonly只能用于类的成员变量不能用于局部变量,在声明时可以不赋值,除了在构造函数中可以再次赋值外,其它的地方和const一样也不能赋值。5.接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?答答:区别如下(1)抽象类可以有抽象成员(无具体实现),也可以有非抽象成员(有具体实现);接口只有抽象成员。(2)一个类不能同时继承多个抽象类,一个类可以同时实现多个接口。如果多个子类中有很多代码是重复的,这时采用抽象类,因为可以将这些代码放到抽象类的非抽象方法中,这样可以达到代码复用。当实现多个接口时因为抽象类不支持,只能使用接口。6.struct和class有什么区别答:两者都可以有成员变量、属性、索引器、事件、函数、构造函数,主要区别如下:区别点结构类类型值类型引用类型成员变量在声明时不能赋值可以赋值也可以不赋值构造函数可以不写,系统提供默认构造函数,默认构造函数中会将所有成员值设为0,如果写了构造函数则构造函数必须有参数,且在构造函数中必须为每一个成员赋值。可以不写,系统提供默认构造函数,写了也没有结构中的限制。析构函数不能有析构函数可以有析构函数继承性自定义的结构不能从类继承,但可以实现接口,结构都是密封(sealed),不能从结构继承类没有限制7.try后面一个finally,try中有一个return,那么finally中的代码会不会运行?如果运行,是在return后还是return前。答:会运行,并且在return后运行。8.产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。答:该题解题思路有很多,主要是看运行效率如何,下面提供一种方法。int[]array=newint[100];inttemp[]=newint[100];for(inti=0;i100;i++){temp[i]=i+1;}Randomrand=newRandom();for(inti=0;i100;i++){intindex=rand.Next(100-i-1);array[i]=temp[index];temp[index]=temp[100-i-1];}9.C#中要使一个类支持foreach遍历,实现过程怎样?答:必须实现IEnumerable,IEnumerator这两个接口,如下:publicclassMyList:IEnumerable,IEnumerator{privateintposition=-1;string[]array=newstring[4];publicMyList(){array[0]=a;array[1]=b;array[2]=c;array[3]=d;}#regionIEnumerable成员//每次使用foreach时都会调用它得到一个枚举器publicIEnumeratorGetEnumerator(){Reset();return(thisasIEnumerator);}#endregion#regionIEnumerator成员//遍历时通过这个属性得到值publicobjectCurrent{get{returnarray[position];}}//访问下一个元素时使用MoveNext移动位置publicboolMoveNext(){if(positionarray.Length-1){position++;returntrue;}elsereturnfalse;}//遍历前要使位置归位publicvoidReset(){position=-1;}#endregion}以下不用foreach遍历集合MyListlist=newMyList();While(list.MoveNext()){Objecto=list.Current;}10.以下程序有什么错?publicclassTestClass{privateintcount;privatestaticinty;publicstaticvoidsetvalue(){count=1;y=1;}}答:在静态函数中只能访问静态成员变量;以上代码访问了实例成员。11.net中什么类不能被继承?答:如果在类前加上sealed关键字,则表示该类为密封类,密封类不能被继承。sealed除了可以应用于类外,还可以应用于实例方法和属性。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed修饰符必须始终与override一起使用。如://下面这个sealed使用正确,表示该类不能继承publicsealedclassTest{privateintmyVar;//下面这个sealed错误,编译不会通过,因为sealed必须和override一起使用publicsealedintMyProperty{get{returnmyVar;}set{myVar=value;}}//下面这个sealed使用正确,表示如果该类不是密封类,//那么在派生类中也不可以重写该方法publicsealedoverridestringToString(){returnbase.ToString();}}12.is和as有什么区别?答:is用来判断一个实例是否属于某个类。如:Dogd=newDog();If(disDog){Console.WriteLine(“d是一只狗”);}以上语句Console.WriteLine(“d是一只狗”);会运行,因为disDog返回true,如果Dog从Animal类继承并实现了IPet接口,则disAnimal和disIPet都会返回true;as用于在兼容的引用类型之间执行转换,如果转换失败则返回null,它等价于如下语句:expressionistype?(type)expression:(type)null13.net中函数传递参数有那些方式?有什么区别?答:传值和传引用,传引用又两种方式,ref和out,ref要求变量在传参前赋值,out可以不赋值。传引用必须是一个地址,传值是指将栈中的值拷贝到函数的参数,传引用表示传入的变量和接收参数是同一个变量publicclassTest{publicintmyVar;publicintMyProperty{get{returnmyVar;}set{myVar=value;}}}以上这个类中有字段和属性privatevoidF(refinti){i=100;}有一个方法传递引用,调用方式如下:Testt=newTest();F(reft.MyProperty);以上代码编译不能通过,因为属性不是变量,其实质是函数,如下则可通过Testt=newTest();F(reft.myVar);因为字段是变量14.一列数的规则如下:1、1、2、3、5、8、13、21、34......求第30位数是多少,用递归算法实现。答:publicclassMainClass{publicstaticvoidMain(){Console.WriteLine(Foo(30));}publicstaticintFoo(inti){if(i=0)return0;elseif(i=2)return1;elsereturnFoo(i-1)+Foo(i-2);}}15.C#中的委托是什么?事件是不是一种委托?答:委托封装了函数指针的集合,它可以指向一组函数。事件也是委托,是一种特殊的委托。16.请编程实现一个冒泡排序算法?答:int[]array=newint[*];inttemp=0;for(inti=0;iarray.Length-1;i++){for(intj=i+1;jarray.Length;j++){if(array[j]array[i]){temp=array[i];array[i]=array[j];array[j]=temp;}}}17.在下面的例子里usingSystem;classA{publicA(){PrintFields();}publicvirtualvoidPrintFields(){}}classB:A{intx=1;inty;publicB(){y=-1;}publicoverridevoidPrintFields(){Console.WriteLine(x={0},y={1},x,y);}}当使用newB()创建B的实例时,产生什么输出?答:X=1,Y=0当使用New创建B的实例时,因为B继承了A类,A的构造函数首先会被运行,但应当注意的是,虽然运行的是A的构造函数,但在A的构造函数中调用的函数首先是在B类中查找,因为PrintFields已被重写,所以最终运行B类中的PrintFields函数。18.CTS、CLS、CLR分别作何解释?答:CTS:CommonTypeSystem通用系统类型。CLS:CommonLanguageSpecification通用语言规范。CLR:CommonLanguageRuntime公共语言运行库。20.netRemoting的工作原理是什么?答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。21.求以下表达式的值,写出您想到的一种或几种实现方法:1-2+3-4+……+m答:intm=Convert.ToInt32(this.TextBox1.Text);intsum=0;for(inti=0;im+1;i++){if((i%2)==1){sum+=i;}Else{sum=Sum-I;}}System.Console.WriteLine(sum.ToString());System.Console.ReadLine();其实还有一个很简单的方式,上面的表达式,把它分成1-2、3-4、5-6……可以看出,如果m是偶数,那么结果就是m/2*(-1),如果m是奇数,结果就是m-m/222.列举ASP.NET页面之间传递值的几种方式。答.1).使用QueryString,如....?id=1;response.Redirect()....2).使用Session变量3).使用Server.Transfer4).Application5).inputtype=hidden/input6).数据库7).ViewStat8).cookie23.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?答:在页面中调用下面的函数,SetTextBox(this);publicvoidSetTextBox(Controlctrl){if(ctrlisTextBox){(ctrlasTextBox).Text=string.Empty;}else{foreach(Controlchildinctrl.Controls){SetTextBox(ctrl);}}}24.根据线程安全的相关知识,分析以下代码,当调用test方法时i10时是否会引起死锁?并简要说明理由。ClassA{publicvoidTest(inti){lock(this){if(i10){i--;Test(i);}}}}答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)25.简要谈一下您对微软.NET构架下remoting和webservice两项技术的理解以及实际中的应用。答:WebSevice使用HTTP协议,因此可以穿透防火墙。而Remoting使用TCP/IP,二进制传送提高效率。remoting是.net中用来跨越machine,process,appdomain进行方法调用的技术,对于三层结构的程序,就可以使用remoting技术来构建.它是分布应用的基础技术.相当于以前的DCOM;WebSer