1 / 44
文档名称:

刚毕业1年2年3年工作经验都可用的C#面试题及答案(设计模式在后面).pdf

格式:pdf   大小:4,135KB   页数:44页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

刚毕业1年2年3年工作经验都可用的C#面试题及答案(设计模式在后面).pdf

上传人:1781111**** 2024/5/11 文件大小:4.04 MB

下载得到文件列表

刚毕业1年2年3年工作经验都可用的C#面试题及答案(设计模式在后面).pdf

相关文档

文档介绍

文档介绍:该【刚毕业1年2年3年工作经验都可用的C#面试题及答案(设计模式在后面) 】是由【1781111****】上传分享,文档一共【44】页,该文档可以免费在线阅读,需要了解更多关于【刚毕业1年2年3年工作经验都可用的C#面试题及答案(设计模式在后面) 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:..C#面试题(设计模式在后面)2。const和readonly有什么区别?答:const可以用于类的成员常量和局部常量,必须在声明时赋值,之后不可以对常量进行赋值。而readonly只能用于类的成员变量不能用于局部变量,在声明时可以不赋值,除了在构造函数中可以再次赋值外,。接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?答答:区别如下(1)抽象类可以有抽象成员(无具体实现),也可以有非抽象成员(有具体实现);接口只有抽象成员。(2)一个类不能同时继承多个抽象类,,这时采用抽象类,因为可以将这些代码放到抽象类的非抽象方法中,,:两者都可以有成员变量、属性、索引器、事件、函数、构造函数,主要区别如下:区别点结构类类型值类型引用类型成员变量在声明时不能赋值可以赋值也可以不赋值构造函数可以不写,系统提供默认构造函数,默认构造函数中会将所有成员值设为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;i<100;i++){temp[i]=i+1;}Randomrand=newRandom();:..for(inti=0;i<100;i++){intindex=rand。Next(100-i-1);array[i]=temp[index];temp[index]=temp[100—i-1];}9。C#中要使一个类支持foreach遍历,实现过程怎样?答:必须实现IEnumerable,IEnumerator这两个接口,如下:lassMyList:IEnumerable,IEnumerator{privateintposition=-1;string[]array=newstring[4];publicMyList(){array[0]=”aarray[;;}#regionIEnumerable成员//每次使用foreach时都会调用它得到一个枚举器etEnumerator(){Reset();return(thisasIEnumerator);}#endregion#regionIEnumerator成员//遍历时通过这个属性得到值publicobjectCurrent{get{returnarray[position];}}//访问下一个元素时使用MoveNext移动位置publicboolMoveNext():..{if(position<array。Length—1){position++;returntrue;}elsereturnfalse;}//遍历前要使位置归位publicvoidReset(){position=-1;}#endregion}以下不用foreach遍历集合MyListlist=newMyList();While(list。MoveNext()){Objecto=list。Current;}?lassTestClass{privateintcount;privatestaticinty;publicstaticvoidsetvalue(){count=1;y=1;}}答:在静态函数中只能访问静态成员变量;以上代码访问了实例成员。中什么类不能被继承?:..答:如果在类前加上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){(“d是一只狗”);}以上语句Console。WriteLine(“d是一只狗”);会运行,因为disDog返回true,如果Dog从Animal类继承并实现了IPet接口,则disAnimal和disIPet都会返回true;as用于在兼容的引用类型之间执行转换,如果转换失败则返回null,它等价于如下语句:expressionistype?(type)expression:(type)null中函数传递参数有那些方式?有什么区别?:..答:传值和传引用,传引用又两种方式,ref和out,ref要求变量在传参前赋值,,传值是指将栈中的值拷贝到函数的参数,传引用表示传入的变量和接收参数是同一个变量lassTest{publicintmyVar;publicintMyProperty{get{returnmyVar;}set{myVar=value;}}}以上这个类中有字段和属性privatevoidF(refinti){i=100;}有一个方法传递引用,调用方式如下:Testt=newTest();F(reft。MyProperty);以上代码编译不能通过,因为属性不是变量,其实质是函数,如下则可通过Testt=newTest();F();因为字段是变量14。一列数的规则如下:1、1、2、3、5、8、13、21、34。。。.。.求第30位数是多少,用递归算法实现。答:lassMainClass{publicstaticvoidMain(){Console。WriteLine(Foo(30));}publicstaticintFoo(inti){if(i<=0):..return0;elseif(i〈=2)return1;elsereturnFoo(i—1)+Foo(i—2);}}#中的委托是什么?事件是不是一种委托?答:委托封装了函数指针的集合,,?答:int[]array=newint[*];inttemp=0;for(inti=0;i<-1;i++){for(intj=i+1;j〈array。Length;j++){if(array[j]〈array[i]){temp=array[i];array[i]=array[j];array[j]=temp;}}};classA{publicA(){PrintFields();}publicvirtualvoidPrintFields(){}:..}classB:A{intx=1;inty;publicB(){y=—1;}publicoverridevoidPrintFields(){(”x={0},y={1}”,x,y);}}当使用newB()创建B的实例时,产生什么输出?答:X=1,Y=0当使用New创建B的实例时,因为B继承了A类,A的构造函数首先会被运行,但应当注意的是,虽然运行的是A的构造函数,但在A的构造函数中调用的函数首先是在B类中查找,因为PrintFields已被重写,所以最终运行B类中的PrintFields函数。、CLS、CLR分别作何解释?答:。Remoting的工作原理是什么?答:服务器端向客户端发送一个进程编号,一个程序域编号,。求以下表达式的值,写出您想到的一种或几种实现方法:1—2+3—4+……+m答:intm=Convert。ToInt32(this。TextBox1。Text);intsum=0;for(inti=0;i〈m+1;i++){if((i%2)==1){sum+=i;:..}Else{sum=Sum—I;}}System。(());();其实还有一个很简单的方式,上面的表达式,把它分成1—2、3—4、5-6……可以看出,如果m是偶数,那么结果就是m/2*(—1),如果m是奇数,结果就是m—m/。)。使用QueryString,如.。。。?id=1;response。Redirect()..。.2)。使用Session变量3).使用Server。Transfer4).Application〈/input〉6)。数据库7).ViewStat8)。cookie23。?答:在页面中调用下面的函数,SetTextBox(this);publicvoidSetTextBox(Controlctrl){if(ctrlisTextBox){(ctrlasTextBox).Text=string。Empty;}else{foreach(){SetTextBox(ctrl);}}}:..,分析以下代码,当调用test方法时i>10时是否会引起死锁?{publicvoidTest(inti){lock(this){if(i〉10){i——;Test(i);}}}}答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)。答:WebSevice使用HTTP协议,因此可以穿透防火墙。而Remoting使用TCP/IP,二进制传送提高效率。中用来跨越machine,process,appdomain进行方法调用的技术,对于三层结构的程序,。相当于以前;WebService是一种构建应用程序的普通模型,,基于组件的对象模型26。公司要求开发一个继承System。,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行(排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的思路答:根据点击的列头,包该列的ID取出,按照该ID排序后,在绑定到ListView中。=newString(”xyz”);创建了几个StringObject?答:两个对象,一个是“xyx”字符串常量,一个是值为的引用对像s。;和strings=;有什么区别,哪一种方式更好?:..文字常量,引用该内存,strings=string。Empty;s引用string类中的静态变量地址(静态变量开始会被初始化,所以无论引用多少次,只会分配一次内存),两者比较,后者少了一次内存分配,所以效率更高。?答:不能。31。是否可以继承String类?答:string是密封类,所以不能被继承。,微软提出了什么方法加以解决?答:是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sateserver或SQLServer数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。33。进程和线程的区别?答:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。?答:栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小35。成员变量和成员函数前加static的作用?答:它们被称为常成员变量和常成员函数,。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。与ASP相比,主要有哪些进步?答:asp解释型,aspx编译型,性能提高,可以跟美工的工作分开进行,更有利于团队开发。36。在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using:,在作用域过后会自动调用该对象的Dispose方法。new:A。新建实例B。,,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,:stringinputStr=”xxxx”;:..Trim();inputStr=Regex。Replace(inputStr。Trim({2,},);注:Replace的第二个参数的”{2,}前有一个空格,第三个参数是一个空格,表示,出现了2个或多个空格时将其替换成1个空格。?为什么?inti=5;intj=5;if((i,j))Console。;();答:不相等,因为比较的是装箱后堆中的地址;39。什么叫做SQL注入,如何防止?请举例说明。答:利用sql语言漏洞获得合法身份登陆系统。如身份验证的程序设计成:*fromuserswhere;。ExcuteScale();if(obj!=null){//通过验证}这段代码容易被sql注入。如用户在t_name中随便输入,在t_pwd中输入abc'or‘1'=’1就可以进入系统了。可以使用参数方式解决这个问题。?答:动态获取程序集、类型等的信息,并可根据这些信息动态的加载程序集、创建类型、动态调用方法,访问类型的成员等。:static属性里面new,构造函数privatelassSingleton{privatestaticSingletonsingleton;privateSingleton(){}publicstaticSingletonCreateInstance():..ifsingleton==null)singleton=newSingleton();returnsingleton;}}?什么是抽像函数?答:虚函数:可由子类继承并重写的函数。抽像函数:规定其非虚子类必须实现的函数,必须被重写。?答:用户控件一般用在内容多为静态,或者少许会改变的情况下。。用的比较大..类似ASP中的include.。:xml用于配置,用于保存静态数据类型。接触XML最多的是webServices。.和config47。中常用的对象有哪些?分别描述一下。答:Connection数据库连接对像Command数据库命令DataReader数据读取器DataAdapterf数据适配器,用于填充DataSetDataSet数据集1。传入某个属性的set方法的隐含参数的名称是什么?value,它的类型和属性所声名的类型相同。#中实现继承?在类名后加上一个冒号,。C#支持多重继承么?不支持。可以用接口来实现。?在继承或间接继承与这个类的子类中可以访问。5。私有成员会被继承么?会,但是不能被访问。所以看上去他们似乎是不能被继承的,。被protectedinternal修饰的属性/方法只能在它的在同一个程序集(Assembly)中的子类被访问。7。C#提供一个默认的无参数构造函数,当我实现了另外一个有一个参数的构造函数时候,还想保留这个无参数的构造函数。这样我应该写几个构造函数?:..#就不会再提供默认的构造函数了,所以需要手动实现那个无参数构造函数。#中所有对象共同的基类是什么?System。。重载和覆写有什么区别?重载提供了对一个方法签名的不同参数调用的实现。覆写提供了子类中改变父类方法行为的实现。,virtual有什么含意?被virtual修饰的方法可以被子类覆写。?不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override。?不可以,甚至子类中无法访问父类中的私有方法。13。能够阻止某一个类被其他类继承么?可以,使用关键字sealed。14。能够实现允许某个类被继承,但不允许其中的某个方法被覆写么?可以,标记这个类为public,并标记这个方法为sealed。15。什么是抽象类(abstractclass)?一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化。16。何时必须声明一个类为抽象类?当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。(interface)是什么?只含有共有抽象方法(publicabstractmethod)的类。这些方法必须在子类中被实现。18。为什么不能指定接口中方法的修饰符?接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为公有方法。??这种情况中你可以决定如何实现。当然需要特别得小心。但是在编译环节是没有问题的。?接口中所有方法必须是抽象的,并且不能指定方法的访问修饰符。抽象类中可以有方法的实现,也可以指定方法的访问修饰符。?:..。如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理?答:。Transfer7。请编程遍历页面上所有TextBox控件并给它赋值为string。Empty?答:foreach(System。Windows。Forms。Controlcontrolinthis。Controls){if(controlisSystem。Windows。Forms。TextBox){System。Windows。Forms。TextBoxtb=(System。。TextBox)control;tb。Text=;}}?答:voidBubbleSort(SeqListR){//R(l..n)是待排序的文件,采用自下向上扫描,对R做冒泡排序inti,j;Booleanexchange;//交换标志for(i=1;i<n;i++)//最多做n-1趟排序{exchange=FALSE;//本趟排序开始前,交换标志应为假for(j=n-1;j>=i;j)//对当前无序区R[i..n]自下向上扫描if(R[j+1]。key〈R[j].key)//交换记录{R[0]=R[j+1];//R[0]不是哨兵,仅做暂存单元R[j+1]=R[j];R[j]=R[0];exchange=TRUE;//发生了交换,故将交换标志置为真}if(!exchange)//本趟排序未发生交换,提前终止算法return;}//endfor(外循环)}//#中索引器的实现过程,是否只能根据数字进行索引?:..#中的索引器通常用于索引数组。索引器不单能索引数字(数组下标),还能索引一些HASHMAP的字符串,所以,通常来说,C#中类的索引器通常只有一个,就是THIS,但也可以有无数个,只要你的参数列表不同就可以了索引器和返回值无关不是。可以用任意类型。,写出您想到的一种或几种实现方法:12+3-4+……+mintn=(TextBox1。Text);intsum=0;for(inti=0;i<n+1;i++){if(i%2==1){sum=sum+i;}else{sum=sum-i;}}Response。Write(());,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?答:一般为3层,数据访问层,业务层,表示层。,业务表观层实现与表示层的沟通,:分工明确,条理清晰,易于调试,而且具有可扩展性。缺点:?答:应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。?答:装箱:。拆箱:从object类型到值类型或从接口类型到实现该接口的值类型的显式转换。16。什么是受管制的代码?答:unsafe:非托管代码。不经过CLR运行。:..?答:RTTI:类型识别系统。18。.net中读写数据库需要用到那些类?他们的作用?答:Connection数据库连接对象DataSet:数据存储器。mand:执行语句命令。DataAdapter:数据的集合,用语填充。?分别是什么原理?答:提供了3种认证方式:windows身份验证,:,:用Cookie来保存用户凭证,并将未经身份验证的用户重定向到自定义的登录页。Passport验证:通过Microsoft的集中身份验证服务执行的,他为成员站点提供单独登录和核心配置文件服务。-Behind技术?答:ASPX,RESX和CS三个后缀的文件,。,配件的意思是?答:程序集。(中间语言,源数据,资源,装配清单)22。常用的调用WebService的方法有哪些?答:。exe命令行工具。。.netRemoting的工作原理是什么?答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。25。中类(class)与结构(struct)的异同?答:Class可以被实例化,属于引用类型,是分配在内存的堆上的。Struct属于值类型,是分配在内存的栈上的。(delegate)的知识,请完成以下用户控件中代码片段的填写:namespacetest{publicdelegatevoidOnDBOperate();lassUserControlBase:System。Windows。Forms。UserControl{publiceventOnDBOperateOnNew;privatevoidtoolBar_ButtonClick(objectsender,):..{if((BtnNew)){//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。}}}答:if(OnNew!=null)OnNew(this,e);,完成填空某某某inti=System。Text。Encoding。(strTmp)。Length;intj=;以上代码执行完后,i=j=答:i=13,j=1028。SQLSERVER服务器中,给定表table1中有两个字段ID、LastUpdateDate,ID表示更新的事务号,LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号答:SelectIDFROMtable1WhereLastUpdateDate=(SelectMAX(LastUpdateDate)FROMtable1)29。根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。publicvoidtest(inti){lock(this){if(i〉10){i-—;test(i);}}}答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生):..:WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,。,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行(排序的方式如DataGrid相似).根据您的知识,请简要谈一下您的思路答:根据点击的列头,包该列的I