2023年C程序員面試必答_第1頁(yè)
2023年C程序員面試必答_第2頁(yè)
2023年C程序員面試必答_第3頁(yè)
2023年C程序員面試必答_第4頁(yè)
2023年C程序員面試必答_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C#程序員面試必答1.靜態(tài)變量和非靜態(tài)變量的區(qū)別?答:靜態(tài)變量:靜態(tài)變量使用static修飾符進(jìn)行聲明在所屬類被裝載時(shí)創(chuàng)建通過類進(jìn)行訪問所屬類的所有實(shí)例的同一靜態(tài)變量都是同一個(gè)值非靜態(tài)變量:不帶有static修飾符聲明的變量稱做非靜態(tài)變量在類被實(shí)例化時(shí)創(chuàng)建通過對(duì)象進(jìn)行訪問同一個(gè)類的不同實(shí)例的同一非靜態(tài)變量可以是不同的值示例:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample01{classProgram{classClass1{publicstaticStringstat(yī)icStr=&amp;quot;Class&amp;quot;;publicStringnotstaticStr=&amp;quot;Obj&amp;quot;;}staticvoidMain(string[]args){//靜態(tài)變量通過類進(jìn)行訪問,該類所有實(shí)例的同一靜態(tài)變量都是同一個(gè)值Console.WriteLine(&amp;quot;Class1'sstaticStr:{0}&amp;quot;,Class1.staticStr);Class1tmpObj1=newClass1();tmpObj1.notstaticStr=&amp;quot;tmpObj1&;quot;;Class1tmpObj2=newClass1();tmpObj2.notstaticStr=&amp;quot;tmpObj2&amp;quot;;//非靜態(tài)變量通過對(duì)象進(jìn)行訪問,不同對(duì)象的同一非靜態(tài)變量可以有不同的值Console.WriteLine(&amp;quot;tmpObj1'snotstaticStr:{0}&amp;quot;,tmpObj1.notstaticStr);Console.WriteLine(&amp;quot;tmpObj2'snotstaticStr:{0}&quot;,tmpObj2.notstaticStr);Console.ReadLine();}}}復(fù)制代碼結(jié)果:Class1'sstaticStr:ClasstmpObj1'snotstaticStr:tmpObj1tmpObj2'snotstaticStr:tmpObj22.const和staticreadonly區(qū)別?答:const用const修飾符聲明的成員叫常量,是在編譯期初始化并嵌入到客戶端程序staticreadonly用staticreadonly修飾符聲明的成員仍然是變量,只但是具有和常量類似的使用方法:通過類進(jìn)行訪問、初始化后不可以修改。但與常量不同的是這種變量是在運(yùn)營(yíng)期初始化示例:測(cè)試類:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample02Lib{publicclassClass1{publicconstStringstrConst=&amp;quot;Const&amp;quot;;publicstat(yī)icreadonlyStringstrStaticReadonly=&amp;quot;StaticReadonly&amp;quot;;//publicconstStringstrConst=&amp;quot;ConstChanged&amp;quot;;//publicstaticreadonlyStringstrStat(yī)icReadonly=&amp;quot;Stat(yī)icReadonlyChanged&amp;quot;;}//5-1-a-s-p-x}復(fù)制代碼客戶端代碼:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingExample02Lib;namespaceExample02{classProgram{staticvoidMain(string[]args){//修改Example02中Class1的strConst初始值后,只編譯Example02Lib項(xiàng)目//然后到資源管理器里把新編譯的Example02Lib.dll拷貝Example02.exe所在的目錄,執(zhí)行Example02.exe//切不可在IDE里直接調(diào)試運(yùn)營(yíng)由于這會(huì)重新編譯整個(gè)解決方案?。?/可以看到strConst的輸出沒有改變,而strStaticReadonly的輸出已經(jīng)改變//表白Const變量是在編譯期初始化并嵌入到客戶端程序,而StaticReadonly是在運(yùn)營(yíng)時(shí)初始化的Console.WriteLine(&quot;strConst:{0}&amp;quot;,Class1.strConst);Console.WriteLine(&quot;strStaticReadonly:{0}&quot;,Class1.strStaticReadonly);Console.ReadLine();}}}復(fù)制代碼結(jié)果:strConst:ConststrStaticReadonly:StaticReadonly修改后的示例:測(cè)試類:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample02Lib{publicclassClass1{//publicconstStringstrConst=&amp;quot;Const&;quot;;//publicstaticreadonlyStringstrStat(yī)icReadonly=&amp;quot;StaticReadonly&amp;quot;;publicconstStringstrConst=&quot;ConstChanged&amp;quot;;publicstaticreadonlyStringstrStaticReadonly=&quot;StaticReadonlyChanged&amp;quot;;}}復(fù)制代碼結(jié)果strConst:ConststrStaticReadonly:Stat(yī)icReadonlyChanged3.extern是什么意思?答:extern修飾符用于聲明由程序集外部實(shí)現(xiàn)的成員函數(shù)經(jīng)常用于系統(tǒng)API函數(shù)的調(diào)用(通過DllImport)。注意,和DllImport一起使用時(shí)要加上static修飾符也可以用于對(duì)于同一程序集不同版本組件的調(diào)用(用extern聲明別名)不能與abstract修飾符同時(shí)使用51aspx示例:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;namespaceExample03{classProgram{//注意DllImport是一個(gè)AttributeProperty,在System.Runtime.InteropServices命名空間中定義//extern與DllImport一起使用時(shí)必須再加上一個(gè)stat(yī)ic修飾符[DllImport(&;quot;User32.dll&amp;quot;)]publicstaticexternintMessageBox(intHandle,stringMessage,stringCaption,intType);staticintMain(){stringmyString;Console.Write(&;quot;Enteryourmessage:&amp;quot;);myString=Console.ReadLine();returnMessageBox(0,myString,&amp;quot;MyMessageBox&amp;quot;,0);}}}復(fù)制代碼結(jié)果:4.abstract是什么意思?答:abstract修飾符可以用于類、方法、屬性、事件和索引指示器(indexer),表達(dá)其為抽象成員abstract不可以和static、virtual、override一起使用聲明為abstract成員可以不涉及實(shí)現(xiàn)代碼,但只有類中尚有未實(shí)現(xiàn)的抽象成員,該類就不可以被實(shí)例化,通常用于強(qiáng)制繼承類必須實(shí)現(xiàn)某一成員示例:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample04{#region基類,抽象類publicabstractclassBaseClass{//抽象屬性,同時(shí)具有g(shù)et和set訪問器表達(dá)繼承類必須將該屬性實(shí)現(xiàn)為可讀寫publicabstractStringAttribute{get;set;}//抽象方法,傳入一個(gè)字符串參數(shù)無(wú)返回值publicabstractvoidFunction(Stringvalue);//抽象事件,類型為系統(tǒng)預(yù)定義的代理(delegate):EventHandlerpublicabstracteventEventHandlerEvent;//抽象索引指示器,只具有g(shù)et訪問器表達(dá)繼承類必須將該索引指示器實(shí)現(xiàn)為只讀publicabstractCharthis[intIndex]{get;}}#endregion#region繼承類publicclassDeriveClass:BaseClass{privateStringat(yī)tribute;publicoverrideStringAttribute{get{returnattribute;}set{attribute=value;}}publicoverridevoidFunction(Stringvalue){at(yī)tribute=value;if(Event!=null){Event(this,newEventArgs());}}publicoverrideeventEventHandlerEvent;publicoverrideCharthis[intIndex]{get{returnattribute[Index];}}}#endregionclassProgram{staticvoidOnFunction(objectsender,EventArgse){for(inti=0;i<((DeriveClass)sender).Attribute.Length;i++){Console.WriteLine(((DeriveClass)sender)[i]);}}staticvoidMain(string[]args){DeriveClasstmpObj=newDeriveClass();tmpObj.Attribute=&amp;quot;1234567&quot;;Console.WriteLine(tmpObj.Attribute);//將靜態(tài)函數(shù)OnFunction與tmpObj對(duì)象的Event事件進(jìn)行關(guān)聯(lián)tmpObj.Event+=newEventHandler(OnFunction);tmpObj.Function(&amp;quot;7654321&quot;);Console.ReadLine();}}}復(fù)制代碼結(jié)果:123456776543215.internal修飾符起什么作用?答:internal修飾符可以用于類型或成員,使用該修飾符聲明的類型或成員只能在同一程集內(nèi)訪問接口的成員不能使用internal修飾符示例Example05Lib項(xiàng)目的Class1usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample05Lib{publicclassClass1{internalStringstrInternal=null;publicStringstrPublic;}}復(fù)制代碼結(jié)果Example05Lib項(xiàng)目的Class2類可以訪問到Class1的strInternal成員Example05項(xiàng)目的Program類無(wú)法訪問到Class1的strInternal成員6.sealed修飾符是干什么的?答:sealed修飾符表達(dá)密封用于類時(shí),表達(dá)該類不能再被繼承,不能和abstract同時(shí)使用,由于這兩個(gè)修飾符在含義上互相排斥用于方法和屬性時(shí),表達(dá)該方法或?qū)傩圆荒茉俦焕^承,必須和override關(guān)鍵字一起使用,由于使用sealed修飾符的方法或?qū)傩钥隙ㄊ腔愔邢鄳?yīng)的虛成員通常用于實(shí)現(xiàn)第三方類庫(kù)時(shí)不想被客戶端繼承,或用于沒有必要再繼承的類以防止濫用繼承導(dǎo)致層次結(jié)構(gòu)體系混亂恰當(dāng)?shù)倪\(yùn)用sealed修飾符也可以提高一定的運(yùn)營(yíng)效率,由于不用考慮繼承類會(huì)重寫該成員示例:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample06{classProgram{classA{publicvirtualvoidF(){Console.WriteLine(&amp;quot;A.F&quot;);}publicvirtualvoidG(){Console.WriteLine(&quot;A.G&amp;quot;);}}classB:A{publicsealedoverridevoidF(){Console.WriteLine(&amp;quot;B.F&quot;);}publicoverridevoidG(){Console.WriteLine(&;quot;B.G&quot;);}}classC:B{publicoverridevoidG(){Console.WriteLine(&amp;quot;C.G&quot;);}}staticvoidMain(string[]args){newA().F();newA().G();newB().F();newB().G();newC().F();newC().G();Console.ReadLine();}}}復(fù)制代碼結(jié)果:類B在繼承類A?xí)r可以重寫兩個(gè)虛函數(shù),如圖所示:由于類B中對(duì)F方法進(jìn)行了密封,類C在繼承類B時(shí)只能重寫一個(gè)函數(shù),如圖所示:控制臺(tái)輸出結(jié)果,類C的方法F只能是輸出類B中對(duì)該方法的實(shí)現(xiàn):A.FA.GB.FB.GB.FC.G7.override和overload的區(qū)別?答:override表達(dá)重寫,用于繼承類對(duì)基類中虛成員的實(shí)現(xiàn)overload表達(dá)重載,用于同一個(gè)類中同名方法不同參數(shù)(涉及類型不同或個(gè)數(shù)不同)的實(shí)現(xiàn)示例:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample07{classProgram{classBaseClass{publicvirtualvoidF(){Console.WriteLine(&;quot;BaseClass.F&;quot;);}}classDeriveClass:BaseClass{publicoverridevoidF(){base.F();Console.WriteLine(&amp;quot;DeriveClass.F&amp;quot;);}publicvoidAdd(intLeft,intRight){Console.WriteLine(&amp;quot;AddforInt:{0}&amp;quot;,Left+Right);}publicvoidAdd(doubleLeft,doubleRight){Console.WriteLine(&amp;quot;Addforint:{0}&amp;quot;,Left+Right);}}staticvoidMain(string[]args){DeriveClasstmpObj=newDeriveClass();tmpObj.F();tmpObj.Add(1,2);tmpObj.Add(1.1,2.2);Console.ReadLine();}}}復(fù)制代碼結(jié)果:BaseClass.FDeriveClass.FAddforInt:3Addforint:3.38.什么是索引指示器?答:實(shí)現(xiàn)索引指示器(indexer)的類可以象數(shù)組那樣使用其實(shí)例后的對(duì)象,但與數(shù)組不同的是索引指示器的參數(shù)類型不僅限于int簡(jiǎn)樸來(lái)說,其本質(zhì)就是一個(gè)含參數(shù)屬性示例:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample08{publicclassPoint{privatedoublex,y;publicPoint(doubleX,doubleY){x=X;y=Y(jié);}//重寫ToString方法方便輸出publicoverridestringToString(){returnString.Format(&amp;quot;X:{0},Y:{1}&amp;quot;,x,y);}}publicclassPoints{Point[]points;publicPoints(Point[]Points){points=Points;}publicintPointNumber{get{returnpoints.Length;}}//實(shí)現(xiàn)索引訪問器publicPointthis[intIndex]{get{returnpoints[Index];}}}//感謝watsonhua()的指點(diǎn)//索引指示器的實(shí)質(zhì)是含參屬性,參數(shù)并不只限于intclassWeatherOfWeek{publicstringthis[intIndex]{get{//注意case段使用return直接返回所以不需要breakswitch(Index){case0:{return&quot;Todayiscloudy!&amp;quot;;}case5:{return&amp;quot;Todayisthundershower!&amp;quot;;}default:{return&amp;quot;Todayisfine!&amp;quot;;}}}}publicstringthis[stringDay]{get{stringTodayWeather=null;//switch的標(biāo)準(zhǔn)寫法switch(Day){case&amp;quot;Sunday&amp;quot;:{TodayWeather=&amp;quot;Todayiscloudy!&amp;quot;;break;}case&quot;Friday&amp;quot;:{TodayWeat(yī)her=&amp;quot;Todayisthundershower!&amp;quot;;break;}default:{TodayWeather=&quot;Todayisfine!&quot;;break;}}returnTodayWeather;}}}classProgram{staticvoidMain(string[]args){Point[]tmpPoints=newPoint[10];for(inti=0;i<tmpPoints.Length;i++){tmpPoints[i]=newPoint(i,Math.Sin(i));}PointstmpObj=newPoints(tmpPoints);for(inti=0;i<tmpObj.PointNumber;i++){Console.WriteLine(tmpObj[i]);}string[]Week=newstring[]{&amp;quot;Sunday&quot;,&quot;Monday&amp;quot;,&quot;Tuesday&amp;quot;,&amp;quot;Wednesday&quot;,&amp;quot;Thursday&amp;quot;,&amp;quot;Friday&quot;,&amp;quot;Staurday&quot;};WeatherOfWeektmpWeatherOfWeek=newWeatherOfWeek();for(inti=0;i<6;i++){Console.WriteLine(tmpWeat(yī)herOfWeek[i]);}foreach(stringtmpDayinWee(cuò)k){Console.WriteLine(tmpWeatherOfWeek[tmpDay]);}Console.ReadLine();}}}復(fù)制代碼結(jié)果:X:0,Y:0X:1,Y:0.8497X:2,Y:0.682X:3,Y:0.9867X:4,Y:-0.928X:5,Y:-0.138X:6,Y:-0.2794X:7,Y:0.789X:8,Y:0.382X:9,Y:0.4121Todayiscloudy!Todayisfine!Todayisfine?。詏dayisfine!Todayisfine?。詏dayisthundershower!Todayiscloudy!Todayisfine!Todayisfine!Todayisfine!Todayisfine!Todayisthundershower!Todayisfine!9.new修飾符是起什么作用?答:new修飾符與new操作符是兩個(gè)概念new修飾符用于聲明類或類的成員,表達(dá)隱藏了基類中同名的成員。而new操作符用于實(shí)例化一個(gè)類型new修飾符只能用于繼承類,一般用于填補(bǔ)基類設(shè)計(jì)的局限性new修飾符和override修飾符不可同時(shí)用在一個(gè)成員上,由于這兩個(gè)修飾符在含義上互相排斥示例:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample09{classBaseClass{//基類設(shè)計(jì)者聲明了一個(gè)PI的公共變量,方便進(jìn)行運(yùn)算publicstaticdoublePI=3.1415;}classDervieClass:BaseClass{//繼承類發(fā)現(xiàn)該變量的值不能滿足運(yùn)算精度,于是可以通過new修飾符顯示隱藏基類中的聲明publicnewstaticdoublePI=3.1415926;}classProgram{staticvoidMain(string[]args){Console.WriteLine(BaseClass.PI);Console.WriteLine(DervieClass.PI);Console.ReadLine();}}}復(fù)制代碼結(jié)果:3.14153.141592610.this關(guān)鍵字的含義?答:this是一個(gè)保存字,僅限于構(gòu)造函數(shù)和方法成員中使用在類的構(gòu)造函數(shù)中出現(xiàn)表達(dá)對(duì)正在構(gòu)造的對(duì)象自身的引用,在類的方法中出現(xiàn)表達(dá)對(duì)調(diào)用該方法的對(duì)象的引用,在結(jié)構(gòu)的構(gòu)造上函數(shù)中出現(xiàn)表達(dá)對(duì)正在構(gòu)造的結(jié)構(gòu)的引用,在結(jié)構(gòu)的方法中出現(xiàn)表達(dá)對(duì)調(diào)用該方法的結(jié)果的引用this保存字不能用于靜態(tài)成員的實(shí)現(xiàn)里,由于這時(shí)對(duì)象或結(jié)構(gòu)并未實(shí)例化在C#系統(tǒng)中,this事實(shí)上是一個(gè)常量,所以不能使用this++這樣的運(yùn)算this保存字一般用于限定同名的隱藏成員、將對(duì)象自身做為參數(shù)、聲明索引訪問器、判斷傳入?yún)?shù)的對(duì)象是否為自身示例:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample10{classClass1{privatedoublec;privatestringvalue;publicdoubleC{get{returnc;}}publicClass1(doublec){//限定同名的隱藏成員this.c=c;}publicClass1(Class1value){//用對(duì)象自身實(shí)例化自己沒故意義if(this!=value){c=value.C;}}publicoverridestringToString(){//將對(duì)象自身做為參數(shù)returnstring.Format(&quot;{0}Celsius={1}Fahrenheit&quot;,c,UnitTransClass.C2F(this));}//由于好奇,在這做了一個(gè)效率測(cè)試,想看看到底哪種方式訪問成員變量更快,結(jié)論:區(qū)別不大。。。publicstringTest1(){longvTickCount=Environment.TickCount;for(inti=0;i<10000000;i++)this.value=i.ToString();returnstring.Format(yī)(&amp;quot;Havethis.:{0}MSEL&amp;quot;,Environment.TickCount-vTickCount);}publicstringTest2(){longvTickCount=Environment.TickCount;for(inti=0;i<10000000;i++)value=i.ToString();returnstring.Format(&amp;quot;Don'thavethis.:{0}MSEL&amp;quot;,Environment.TickCount-vTickCount);}}classUnitTransClass{publicstat(yī)icdoubleC2F(Class1value){//攝氏到華氏的轉(zhuǎn)換公式return1.8*value.C+32;}}classProgram{staticvoidMain(string[]args){Class1tmpObj=newClass1(37.5);Console.WriteLine(tmpObj);Console.WriteLine(tmpObj.Test1());Console.WriteLine(tmpObj.Test2());Console.ReadLine();}}}復(fù)制代碼結(jié)果:37.5Celsius=99.5FahrenheitHavethis.:4375MSELDon'thavethis.:4406MSEL11.可以使用抽象函數(shù)重寫基類中的虛函數(shù)嗎?答:可以,但需使用new修飾符顯式聲明,表達(dá)隱藏了基類中該函數(shù)的實(shí)現(xiàn)示例:classBaseClass{publicvirtualvoidF(){Console.WriteLine(&quot;BaseClass.F&;quot;);}}abstractclassDeriveClass:BaseClass{publicnewabstractvoidF();}復(fù)制代碼12.密封類可以有虛函數(shù)嗎?答:可以,基類中的虛函數(shù)將隱式的轉(zhuǎn)化為非虛函數(shù),但密封類自身不能再增長(zhǎng)新的虛函數(shù)示例:classBaseClass{publicvirtualvoidF(){Console.WriteLine(&quot;BaseClass.F&quot;);}}sealedclassDeriveClass:BaseClass{//基類中的虛函數(shù)F被隱式的轉(zhuǎn)化為非虛函數(shù)//密封類中不能再聲明新的虛函數(shù)G//publicvirtualvoidG()//{//Console.WriteLine(&amp;quot;DeriveClass.G&;quot;);//}}復(fù)制代碼13.假如基類中的虛屬性只有一個(gè)屬性訪問器,那么繼承類重寫該屬性后可以有幾個(gè)屬性訪問器?假如基類中有g(shù)et和set兩個(gè)呢?答:假如基類中的虛屬性只有一個(gè)屬性訪問器,那么繼承類重寫該屬性后也應(yīng)只有一個(gè)。假如基類中有g(shù)et和set兩個(gè)屬性訪問器,那么繼承類中可以只有一個(gè)也可以同時(shí)有兩個(gè)屬性訪問器14.abstract可以和virtual一起使用嗎?可以和override一起使用嗎?答:abstract修飾符不可以和static、virtual和override修飾符一起使用15.接口可以包含哪些成員?答:接口可以包含屬性、方法、索引指示器和事件,但不能包含常量、域、操作符、構(gòu)造函數(shù)和析構(gòu)函數(shù),并且也不能包含任何靜態(tài)成員16.類和結(jié)構(gòu)的區(qū)別?答:類:類是引用類型在堆上分派,類的實(shí)例進(jìn)行賦值只是復(fù)制了引用,都指向同一段實(shí)際對(duì)象分派的內(nèi)存類有構(gòu)造和析構(gòu)函數(shù)類可以繼承和被繼承結(jié)構(gòu):結(jié)構(gòu)是值類型在棧上分派(雖然棧的訪問速度比較堆要快,但棧的資源有限放),結(jié)構(gòu)的賦值將分派產(chǎn)生一個(gè)新的對(duì)象。結(jié)構(gòu)沒有構(gòu)造函數(shù),但可以添加。結(jié)構(gòu)沒有析構(gòu)函數(shù)結(jié)構(gòu)不可以繼承自另一個(gè)結(jié)構(gòu)或被繼承,但和類同樣可以繼承自接口示例:根據(jù)以上比較,我們可以得出一些輕量級(jí)的對(duì)象最佳使用結(jié)構(gòu),但數(shù)據(jù)量大或有復(fù)雜解決邏輯對(duì)象最佳使用類。如:Geoemtry(GIS里的一個(gè)概論,在OGC標(biāo)準(zhǔn)里有定義)最佳使用類,而Geometry中點(diǎn)的成員最佳使用結(jié)構(gòu)usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample16{interfaceIPoint{doubleX{get;set;}doubleY{get;set;}doubleZ{get;set;}}//結(jié)構(gòu)也可以從接口繼承structPoint:IPoint{privat(yī)edoublex,y,z;//結(jié)構(gòu)也可以增長(zhǎng)構(gòu)造函數(shù)publicPoint(doubleX,doubleY,doubleZ){this.x=X;this.y=Y;this.z=Z;}publicdoubleX{get{returnx;}set{x=value;}}publicdoubleY{get{returnx;}set{x=value;}}publicdoubleZ{get{returnx;}set{x=value;}}}//在此簡(jiǎn)化了點(diǎn)狀Geometry的設(shè)計(jì),實(shí)際產(chǎn)品中還包含Project(坐標(biāo)變換)等復(fù)雜操作classPointGeometry{privatePointvalue;publicPointGeometry(doubleX,doubleY,doubleZ){value=newPoint(X,Y,Z);}publicPointGeometry(Pointvalue){//結(jié)構(gòu)的賦值將分派新的內(nèi)存this.value=value;}publicdoubleX{get{returnvalue.X;}set{this.value.X=value;}}publicdoubleY{get{returnvalue.Y;}set{this.value.Y=value;}}publicdoubleZ{get{returnvalue.Z;}set{this.value.Z=value;}}publicstat(yī)icPointGeometryoperat(yī)or+(PointGeometryLeft,PointGeometryRigth){returnnewPointGeometry(Left.X+Rigth.X,Left.Y+Rigth.Y,Left.Z+Rigth.Z);}publicoverridestringToString(){returnstring.Format(&amp;quot;X:{0},Y:{1},Z:{2}&amp;quot;,value.X,value.Y,value.Z);}}classProgram{staticvoidMain(string[]args){PointtmpPoint=newPoint(1,2,3);PointGeometrytmpPG1=newPointGeometry(tmpPoint);PointGeometrytmpPG2=newPointGeometry(tmpPoint);tmpPG2.X=4;tmpPG2.Y=5;tmpPG2.Z=6;//由于結(jié)構(gòu)是值類型,tmpPG1和tmpPG2的坐標(biāo)并不同樣Console.WriteLine(tmpPG1);Console.WriteLine(tmpPG2);//由于類是引用類型,對(duì)tmpPG1坐標(biāo)修改后影響到了tmpPG3PointGeometrytmpPG3=tmpPG1;tmpPG1.X=7;tmpPG1.Y=8;tmpPG1.Z=9;Console.WriteLine(tmpPG1);Console.WriteLine(tmpPG3);Console.ReadLine();}}}復(fù)制代碼結(jié)果:X:1,Y:2,Z:3X:4,Y:5,Z:6X:7,Y:8,Z:9X:7,Y:8,Z:917.接口的多繼承會(huì)帶來(lái)哪些問題?答:C#中的接口與類不同,可以使用多繼承,即一個(gè)子接口可以有多個(gè)父接口。但假如兩個(gè)父成員具有同名的成員,就產(chǎn)生了二義性(這也正是C#中類取消了多繼承的因素之一),這時(shí)在實(shí)現(xiàn)時(shí)最佳使用顯式的聲明示例:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample17{classProgram{//一個(gè)完整的接口聲明示例interfaceIExample{//屬性stringP{get;set;}//方法stringF(intValue);//事件eventEventHandlerE;//索引指示器stringthis[intIndex]{get;set;}}interfaceIA{intCount{get;set;}}interfaceIB{intCount();}//IC接口從IA和IB多重繼承interfaceIC:IA,IB{}classC:IC{privateintcount=100;//顯式聲明實(shí)現(xiàn)IA接口中的Count屬性intIA.Count{get{return100;}set{count=value;}}//顯式聲明實(shí)現(xiàn)IB接口中的Count方法intIB.Count(){returncount*count;}}stat(yī)icvoidMain(string[]args){CtmpObj=newC();//調(diào)用時(shí)也要顯式轉(zhuǎn)換Console.WriteLine(&amp;quot;Countproperty:{0}&quot;,((IA)tmpObj).Count);Console.WriteLine(&quot;Countfunction:{0}&amp;quot;,((IB)tmpObj).Count());Console.ReadLine();}}}復(fù)制代碼結(jié)果:Countproperty:100Countfunction:1000018.抽象類和接口的區(qū)別?答:抽象類(abstractclass)可以包含功能定義和實(shí)現(xiàn),接口(interface)只能包含功能定義抽象類是從一系列相關(guān)對(duì)象中抽象出來(lái)的概念,因此反映的是事物的內(nèi)部共性;接口是為了滿足外部調(diào)用而定義的一個(gè)功能約定,因此反映的是事物的外部特性分析對(duì)象,提煉內(nèi)部共性形成抽象類,用以表達(dá)對(duì)象本質(zhì),即“是什么”為外部提供調(diào)用或功能需要擴(kuò)充時(shí)優(yōu)先使用接口19.別名指示符是什么?答:通過別名指示符我們可認(rèn)為某個(gè)類型起一個(gè)別名重要用于解決兩個(gè)命名空間內(nèi)有同名類型的沖突或避免使用冗余的命名空間別名指示符只在一個(gè)單元文獻(xiàn)內(nèi)起作用示例:Class1.cs:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespacecom.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01{classClass1{publicoverridestringToString(){return&quot;com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01'sClass1&amp;quot;;}}}復(fù)制代碼Class2.csusingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespacecom.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02{classClass1{publicoverridestringToString(){return&amp;quot;com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02'sClass1&amp;quot;;}}}復(fù)制代碼主單元(Program.cs):usingSystem;usingSystem.Collections.Generic;usingSystem.Text;//使用別名指示符解決同名類型(51aspx)的沖突usingLib01Class1=com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01.Class1;usingLib02Class2=com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02.Class1;namespaceExample19{classProgram{staticvoidMain(string[]args){Lib01Class1tmpObj1=newLib01Class1();Lib02Class2tmpObj2=newLib02Class2();Console.WriteLine(tmpObj1);Console.WriteLine(tmpObj2);Console.ReadLine();}}}復(fù)制代碼結(jié)果:com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01'sClass1com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02'sClass120.如何釋放非托管資源?答:.NET平臺(tái)在內(nèi)存管理方面提供了GC(GarbageCollection),負(fù)責(zé)自動(dòng)釋放托管資源和內(nèi)存回收的工作,但它無(wú)法對(duì)非托管資源進(jìn)行釋放,這時(shí)我們必須自己提供方法來(lái)釋放對(duì)象內(nèi)分派的非托管資源,比如你在對(duì)象的實(shí)現(xiàn)代碼中使用了一個(gè)COM對(duì)象最簡(jiǎn)樸的辦法,可以通過實(shí)現(xiàn)protectedvoidFinalize()(析構(gòu)函數(shù)會(huì)在編譯時(shí)變成這個(gè)東東)來(lái)釋放非托管資源,由于GC在釋放對(duì)象時(shí)會(huì)檢查該對(duì)象是否實(shí)現(xiàn)了Finalize()方法,假如是則調(diào)用它。但,據(jù)說這樣會(huì)減少效率。。。有一種更好的,那就是通過實(shí)現(xiàn)一個(gè)接口顯式的提供應(yīng)客戶調(diào)用端手工釋放對(duì)象的方法,而不是傻傻的等著GC來(lái)釋放我們的對(duì)象(何況效率又那么低)System命名空間內(nèi)有一個(gè)IDisposable接口,拿來(lái)做這事非常合適,就免得我們自己再聲明一個(gè)接口了此外補(bǔ)充一句,這種實(shí)現(xiàn)并不一定要使用了非托管資源后才用,假如你設(shè)計(jì)的類會(huì)在運(yùn)營(yíng)時(shí)有大些的實(shí)例(象GIS中的Geometry),為了優(yōu)化程序性能,你也可以通過實(shí)現(xiàn)該接口讓客戶調(diào)用端在確認(rèn)不需要這些對(duì)象時(shí)手工釋放它們示例:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample20{classProgram{classClass1:IDisposable{//析構(gòu)函數(shù),編譯后變成protectedvoidFinalize(),GC會(huì)在回收對(duì)象前會(huì)調(diào)用調(diào)用該方法~Class1(){Dispose(false);}//通過實(shí)現(xiàn)該接口,客戶可以顯式地釋放對(duì)象,而不需要等待GC來(lái)釋放資源,據(jù)說那樣會(huì)減少效率voidIDisposable.Dispose(){Dispose(true);}//將釋放非托管資源設(shè)計(jì)成一個(gè)虛函數(shù),提供在繼承類中釋放基類的資源的能力protectedvirtualvoidReleaseUnmanageResources(){//Dosomething...}//私有函數(shù)用以釋放非托管資源privatevoidDispose(booldisposing){ReleaseUnmanageResources();//為true時(shí)表達(dá)是客戶顯式調(diào)用了釋放函數(shù),需告知GC不要再調(diào)用對(duì)象的Finalize方法//為false時(shí)肯定是GC調(diào)用了對(duì)象的Finalize方法,所以沒有必要再告訴GC你不要調(diào)用我的Finalize方法啦if(disposing){GC.SuppressFinalize(this);}}}staticvoidMain(string[]args){//tmpObj1沒有手工釋放資源,就等著GC來(lái)慢慢的釋放它吧Class1tmpObj1=newClass1();//tmpObj2調(diào)用了Dispose方法,傳說比等著GC來(lái)釋放它效率要調(diào)一些//個(gè)人認(rèn)為是由于要逐個(gè)對(duì)象的查看其元數(shù)據(jù),以確認(rèn)是否實(shí)現(xiàn)了Dispose方法吧//當(dāng)然最重要的是我們可以自己擬定釋放的時(shí)間以節(jié)省內(nèi)存,優(yōu)化程序運(yùn)營(yíng)效率Class1tmpObj2=newClass1();((IDisposable)tmpObj2).Dispose();}}}復(fù)制代碼21.P/Invoke是什么?答:在受控代碼與非受控代碼進(jìn)行交互時(shí)會(huì)產(chǎn)生一個(gè)事務(wù)(transition),這通常發(fā)生在使用平臺(tái)調(diào)用服務(wù)(PlatformInvocationServices),即P/Invoke如調(diào)用系統(tǒng)的API或與COM對(duì)象打交道,通過System.Runtime.InteropServices命名空間雖然使用Interop非常方便,但據(jù)估計(jì)每次調(diào)用事務(wù)都要執(zhí)行10到40條指令,算起來(lái)開銷也不少,所以我們要盡量少調(diào)用事務(wù)假如非用不可,建議本著一次調(diào)用執(zhí)行多個(gè)動(dòng)作,而不是多次調(diào)用每次只執(zhí)行少量動(dòng)作的原則22.StringBuilder和String的區(qū)別?答:String雖然是一個(gè)引用類型,但在賦值操作時(shí)會(huì)產(chǎn)生一個(gè)新的對(duì)象,而StringBuilder則不會(huì)所以在大量字符串拼接或頻繁對(duì)某一字符串進(jìn)行操作時(shí)最佳使用StringBuilder,不要使用String示例:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample22{classProgram{staticvoidMain(string[]args){constintcycle=100000;longvTickCount=Environment.TickCount;Stringstr=null;for(inti=0;i<cycle;i++)str+=i.ToString();Console.WriteLine(&;quot;String:{0}MSEL&amp;quot;,Environment.TickCount-vTickCount);vTickCount=Environment.TickCount;//看到這個(gè)變量名我就氣憤,奇怪為什么大家都使它呢?:)StringBuildersb=newStringBuilder();for(inti=0;i<cycle;i++)sb.Append(i);Console.WriteLine(&amp;quot;StringBuilder:{0}MSEL&quot;,Environment.TickCount-vTickCount);Console.ReadLine();}}}復(fù)制代碼結(jié)果:String:102047MSELStringBuilder:46MSEL23.explicit和implicit的含義?答:explicit和implicit屬于轉(zhuǎn)換運(yùn)算符,如用這兩者可以讓我們自定義的類型支持互相互換explicti表達(dá)顯式轉(zhuǎn)換,如從A->B必須進(jìn)行強(qiáng)制類

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論