1.?????? [C#語(yǔ)言基礎(chǔ)]請(qǐng)簡(jiǎn)述拆箱和裝箱卤唉。
答:
裝箱操作:
值類型隱式轉(zhuǎn)換為object類型或由此值類型實(shí)現(xiàn)的任何接口類型的過(guò)程添履。
1.在堆中開(kāi)辟內(nèi)存空間积仗。
2.將值類型的數(shù)據(jù)復(fù)制到堆中壕吹。
3.返回堆中新分配對(duì)象的地址考润。
拆箱操作:
object類型顯示轉(zhuǎn)換為值類型或從接口類型到實(shí)現(xiàn)該接口值類型的過(guò)程棺禾。
1.判斷給定類型是否是裝箱時(shí)的類型刽沾。
2.返回已裝箱實(shí)例中屬于原值類型字段的地址本慕。
2.?????? ?[.NET(C#)] attribute,property侧漓,markup锅尘,tap翻譯
答:attribute翻譯成特性,用來(lái)標(biāo)識(shí)類布蔗,方法 藤违。
property翻譯為屬性,性質(zhì)用于存取類的字段 纵揍。
markup翻譯成標(biāo)記顿乒。
tag翻譯成標(biāo)簽。
3.?????? [.NET(C#)] 程序集的重要特性
答:程序集的一個(gè)重要特性是它們包含的元數(shù)據(jù)描述了對(duì)應(yīng)代碼中定義的類型和方法泽谨。
4.?????? ?[.NET(C#)] ref與out關(guān)鍵字
答:ref 關(guān)鍵字使參數(shù)按引用傳遞璧榄。其效果是,當(dāng)控制權(quán)傳遞回調(diào)用方法時(shí)隔盛,在方法中對(duì)參數(shù)所做的任何更改都將反映在該變量中犹菱。若要使用 ref 參數(shù),則方法定義和調(diào)用方法都必須顯式使用 ref 關(guān)鍵字吮炕。
out 關(guān)鍵字會(huì)導(dǎo)致參數(shù)通過(guò)引用來(lái)傳遞腊脱。這與 ref 關(guān)鍵字類似,不同之處在于 ref 要求變量必須在傳遞之前進(jìn)行初始化龙亲。若要使用 out 參數(shù)陕凹,方法定義和調(diào)用方法都必須顯式使用 out 關(guān)鍵字悍抑。
5.?????? ?[.NET(C#)] new 關(guān)鍵字用法。
答:1) new 運(yùn)算符 :用于創(chuàng)建對(duì)象和調(diào)用構(gòu)造函數(shù)杜耙。
2) new 修飾符 :用于向基類成員隱藏繼承成員搜骡。
3) new 約束 :用于在泛型聲明中約束可能用作類型參數(shù)的參數(shù)的類型。
6.?????? [.NET(C#)] C#中佑女,string str = null 與 string str = ""记靡,說(shuō)明區(qū)別。
答:string str = "" 初始化對(duì)象分配空間团驱。
string str = null 表示一個(gè)空引用摸吠,沒(méi)有占用空間。//實(shí)際情況是嚎花,string為null時(shí)依然為""寸痢,但該題常考紊选。
7.?????? [.NET(C#)]什么是序列化啼止?
答:序列化是將對(duì)象狀態(tài)轉(zhuǎn)換為可保持或傳輸?shù)母袷降倪^(guò)程。 與序列化相對(duì)的是反序列化兵罢,它將流轉(zhuǎn)換為對(duì)象献烦。這兩個(gè)過(guò)程結(jié)合起來(lái),可以輕松地存儲(chǔ)和傳輸數(shù)據(jù)趣些。
8.?????? ?[.NET(C#)] sealed 修飾符有什么特點(diǎn)
答:
1) sealed 修飾符可以應(yīng)用于類仿荆、實(shí)例方法和屬性。密封類不能被繼承坏平。密封方法會(huì)重寫基類中的方法拢操,但其本身不能在任何派生類中進(jìn)一步重寫。當(dāng)應(yīng)用于方法或?qū)傩詴r(shí)舶替,sealed 修飾符必須始終與 override一起使用令境。
2) 將密封類用作基類或?qū)?abstract 修飾符與密封類一起使用是錯(cuò)誤的。
3) 結(jié)構(gòu)是隱式密封的顾瞪;因此它們不能被繼承舔庶。
9.?????? [.NET(C#)] 詳述.NET里class和struct的異同。
答:
相同點(diǎn):
1) 語(yǔ)法類似陈醒。
不同點(diǎn):
1) class是引用類型惕橙,繼承自System.Object類; struct是值類型,繼承自System.ValueType類钉跷,因此不具多態(tài)性弥鹦。但是注意,System.ValueType是個(gè)引用類型。
2) 從職能觀點(diǎn)來(lái)看彬坏,class表現(xiàn)為行為; 而struct常用于存儲(chǔ)數(shù)據(jù)朦促。
3) class支持繼承,可以繼承自類和接口; 而struct沒(méi)有繼承性栓始,struct不能從class繼承务冕,也不能作為class的基類,但struct支持接口繼承幻赚。
4) 實(shí)例化時(shí)禀忆,class要使用new關(guān)鍵字; 而struct可以不使用new關(guān)鍵字,struct在聲明時(shí)就進(jìn)行了初始化過(guò)程落恼,所有的成員變量均默認(rèn)為0或null油湖。
10.? [.NET(C#)]如何選擇結(jié)構(gòu)還是類。
答:1) 堆棧的空間有限领跛,對(duì)于大量的邏輯的對(duì)象,創(chuàng)建類要比創(chuàng)建結(jié)構(gòu)好一些撤奸。
2) 結(jié)構(gòu)表示如點(diǎn)吠昭、矩形和顏色這樣的輕量對(duì)象。例如胧瓜,如果聲明一個(gè)含有 1000 個(gè)點(diǎn)對(duì)象的數(shù)組矢棚,則將為引用每個(gè)對(duì)象分配附加的內(nèi)存。在此情況下府喳,結(jié)構(gòu)的成本較低蒲肋。
3) 在表現(xiàn)抽象和多級(jí)別的對(duì)象層次時(shí),類是最好的選擇钝满。
4) 大多數(shù)情況下該類型只是一些數(shù)據(jù)時(shí)兜粘,結(jié)構(gòu)時(shí)最佳的選擇。
11.? [.NET(C#)]抽象類(abstract class)和接口(interface)的區(qū)別弯蚜。
答:
抽象類:
1) 抽象方法只作聲明孔轴,而不包含實(shí)現(xiàn),可以看成是沒(méi)有實(shí)現(xiàn)體的虛方法碎捺。
2) 抽象類不能被實(shí)例化路鹰。
3) 抽象類可以但不是必須有抽象屬性和抽象方法,但是一旦有了抽象方法收厨,就一定要把這個(gè)類聲明為抽象類晋柱。
4) 具體派生類必須覆蓋基類的抽象方法。
5) 抽象派生類可以覆蓋基類的抽象方法诵叁,也可以不覆蓋雁竞。如果不覆蓋,則其具體派生類必須覆蓋它們黎休。
接口:
1) 接口不能被實(shí)例化浓领。
2) 接口只能包含方法聲明玉凯。
3) 接口的成員包括方法、屬性联贩、索引器漫仆、事件。
4) 接口中不能包含常量泪幌、字段(域)盲厌、構(gòu)造函數(shù)、析構(gòu)函數(shù)祸泪、靜態(tài)成員吗浩。
5) 接口中的所有成員默認(rèn)為public,因此接口中不能有private修飾符没隘。
6) 派生類必須實(shí)現(xiàn)接口的所有成員懂扼。
7) 一個(gè)類可以直接實(shí)現(xiàn)多個(gè)接口,接口之間用逗號(hào)隔開(kāi)右蒲。
8) 一個(gè)接口可以有多個(gè)父接口阀湿,實(shí)現(xiàn)該接口的類必須實(shí)現(xiàn)所有父接口中的所有成員。
抽象類和接口的異同:
相同點(diǎn):
1) 都可以被繼承瑰妄。
2) 都不能被實(shí)例化陷嘴。
3) 都可以包含方法聲明。
4) 派生類必須實(shí)現(xiàn)未實(shí)現(xiàn)的方法间坐。
區(qū) 別:
1) 抽象基類可以定義字段灾挨、屬性、方法實(shí)現(xiàn)竹宋。接口只能定義屬性劳澄、索引器、事件蜈七、和方法聲明浴骂,不能包含字段。
2) 抽象類是一個(gè)不完整的類宪潮,需要進(jìn)一步細(xì)化溯警,而接口是一個(gè)行為規(guī)范。微軟的自定義接口總是后帶able字段狡相,證明其是表述一類“我能做梯轻。。尽棕≡簦”。
3) 接口可以被多重實(shí)現(xiàn),抽象類只能被單一繼承伊诵。
4) 抽象類更多的是定義在一系列緊密相關(guān)的類間单绑,而接口大多數(shù)是關(guān)系疏松但都實(shí)現(xiàn)某一功能的類中。
5) 抽象類是從一系列相關(guān)對(duì)象中抽象出來(lái)的概念曹宴, 因此反映的是事物的內(nèi)部共性搂橙;接口是為了滿足外部調(diào)用而定義的一個(gè)功能約定, 因此反映的是事物的外部特性笛坦。
6) 接口基本上不具備繼承的任何具體特點(diǎn),它僅僅承諾了能夠調(diào)用的方法区转。
7) 接口可以用于支持回調(diào),而繼承并不具備這個(gè)特點(diǎn)。
8) 抽象類實(shí)現(xiàn)的具體方法默認(rèn)為虛的版扩,但實(shí)現(xiàn)接口的類中的接口方法卻默認(rèn)為非虛的废离,當(dāng)然您也可以聲明為虛的。
9) 如果抽象類實(shí)現(xiàn)接口礁芦,則可以把接口中方法映射到抽象類中作為抽象方法而不必實(shí)現(xiàn)蜻韭,而在抽象類的子類中實(shí)現(xiàn)接口中方法。
12.? [.NET(C#)]什么叫應(yīng)用程序域柿扣?
答:1) 操作系統(tǒng)和運(yùn)行庫(kù)環(huán)境通常會(huì)在應(yīng)用程序間提供某種形式的隔離湘捎。
2) 應(yīng)用程序域?yàn)榘踩浴⒖煽啃哉酢姹究刂埔约靶遁d程序集提供了隔離邊界。
3) 應(yīng)用程序域可以理解為一種輕量級(jí)進(jìn)程舷胜。起到安全的作用娩践。占用資源小。
13.? [.NET(C#)]什么是強(qiáng)類型烹骨?
答:為所有變量指定數(shù)據(jù)類型稱為“強(qiáng)類型”翻伺。C#是強(qiáng)類型語(yǔ)言。
14.? [.NET(C#)]托管代碼沮焕。
答:使用基于公共語(yǔ)言運(yùn)行庫(kù)的語(yǔ)言編譯器開(kāi)發(fā)的代碼稱為托管代碼吨岭;托管代碼具有許多優(yōu)點(diǎn),例如:跨語(yǔ)言集成峦树、跨語(yǔ)言異常處理辣辫、增強(qiáng)的安全性、版本控制和部署支持魁巩、簡(jiǎn)化的組件交互模型急灭、調(diào)試和分析服務(wù)等。
15.? [.NET(C#)]什么是CTS谷遂?
答:CTS:通用系統(tǒng)類型 Common Type System葬馋。所有.NET語(yǔ)言共享這一類型系統(tǒng),實(shí)現(xiàn)它們之間無(wú)縫的互操作。該方案還提供了語(yǔ)言之間的繼承性畴嘶。
16.? [.NET(C#)]什么是CLR蛋逾?
答:CLR:公共語(yǔ)言運(yùn)行庫(kù) Common Language Runtime。是一個(gè)運(yùn)行時(shí)環(huán)境窗悯,它負(fù)責(zé)資源管理(內(nèi)存分配和垃圾收集)区匣,并保證應(yīng)用和底層操作系統(tǒng)之間必要的分離。
17.? [.NET(C#)]什么是CLS蟀瞧?
答:CLS:公共語(yǔ)言規(guī)范 Common Language Specification沉颂。可以保證C#組件與其他語(yǔ)言組件間的互操作性悦污。
18.? [.NET(C#)]什么是委托铸屉?
答:1) 委托是一種引用方法的類型。
2) 委托類似于 C++ 函數(shù)指針切端,但它是類型安全的彻坛。
3) 委托允許將方法作為參數(shù)進(jìn)行傳遞。
4) 委托可用于定義回調(diào)方法踏枣。
19.? [.NET(C#)]活動(dòng)目錄的作用昌屉。
答:1) Active Directory存儲(chǔ)了有關(guān)網(wǎng)絡(luò)對(duì)象的信息,并且讓管理員和用戶能夠輕松地查找和使用這些信息茵瀑。
2) Active Directory使用了一種結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ)方式间驮,并以此作為基礎(chǔ)對(duì)目錄信息進(jìn)行合乎邏輯的分層組織。
20.? [.NET(C#)]在.NET中马昨,配件的意思竞帽。
答:程序集(中間語(yǔ)言,源數(shù)據(jù)鸿捧,資源屹篓,裝配清單)。
21.? ?[.NET(C#)]值類型和引用類型的區(qū)別匙奴。
答:1) 值類型通常被分配在棧上堆巧,它的變量直接包含變量的實(shí)例,使用效率比較高泼菌。
2) 引用類型分配在托管堆上谍肤,引用類型的變量通常包含一個(gè)指向?qū)嵗闹羔槪兞客ㄟ^(guò)該指針來(lái)引用實(shí)例哗伯。
3) 一個(gè)是值COPY谣沸,一個(gè)是地址COPY。
值類型
引用類型
內(nèi)存分配地點(diǎn)
分配在棧中
分配在堆中
效率
效率高笋颤,不需要地址轉(zhuǎn)換
效率低乳附,需要進(jìn)行地址轉(zhuǎn)換
內(nèi)存回收
使用完后内地,立即回收
使用完后,不是立即回收赋除,等待GC回收
賦值操作
進(jìn)行復(fù)制阱缓,創(chuàng)建一個(gè)同值新對(duì)象
只是對(duì)原有對(duì)象的引用
函數(shù)參數(shù)與返回值
是對(duì)象的復(fù)制
是原有對(duì)象的引用,并不產(chǎn)生新的對(duì)象
類型擴(kuò)展
不易擴(kuò)展
容易擴(kuò)展举农,方便與類型擴(kuò)展
22.? ?[.NET(C#)].NET中的垃圾回收機(jī)制荆针。
答:.NET Framework 的垃圾回收器管理應(yīng)用程序的內(nèi)存分配和釋放。每次使用 new
運(yùn)算符創(chuàng)建對(duì)象時(shí)颁糟,運(yùn)行庫(kù)都從托管堆為該對(duì)象分配內(nèi)存航背。只要托管堆中有地址空間可用,運(yùn)行庫(kù)就會(huì)繼續(xù)為新對(duì)象分配空間棱貌。但是玖媚,內(nèi)存不是無(wú)限大的。最終婚脱,垃圾回收器必須執(zhí)行回收以釋放一些內(nèi)存今魔。垃圾回收器優(yōu)化引擎根據(jù)正在進(jìn)行的分配情況確定執(zhí)行回收的最佳時(shí)間。當(dāng)垃圾回收器執(zhí)行回收時(shí)障贸,它檢查托管堆中不再被應(yīng)用程序使用的對(duì)象并執(zhí)行必要的操作來(lái)回收它們占用的內(nèi)存错森。
23.? ?[.NET(C#)]什么是索引器?如何使用索引器篮洁?
答:索引器允許類或結(jié)構(gòu)的實(shí)例按照與數(shù)組相同的方式進(jìn)行索引涩维。索引器類似于屬性,不同之處在于它們的訪問(wèn)器采用參數(shù)袁波⊥卟可以用任意類型索引。
1) 索引器使得對(duì)象可按照與數(shù)組相似的方法進(jìn)行索引锋叨。
2) get 訪問(wèn)器返回值。set 訪問(wèn)器分配值宛篇。
3) this 關(guān)鍵字用于定義索引器娃磺。
4) value 關(guān)鍵字用于定義由 set 索引器分配的值。
5) 索引器不必根據(jù)整數(shù)值進(jìn)行索引叫倍,由您決定如何定義特定的查找機(jī)制偷卧。
6) 索引器可被重載。
7) 索引器可以有多個(gè)形參吆倦,例如當(dāng)訪問(wèn)二維數(shù)組時(shí)听诸。
24.? [.NET(C#)]進(jìn)程和線程的區(qū)別。
答:1) 進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的單位蚕泽。
2) 線程是CPU調(diào)度和分派的單位晌梨。
3) 一個(gè)進(jìn)程可以有多個(gè)線程桥嗤,這些線程共享這個(gè)進(jìn)程的資源。
25.? [.NET(C#)]啟動(dòng)一個(gè)線程是用run()還是start()仔蝌?
答:?jiǎn)?dòng)一個(gè)線程是調(diào)用start()方法泛领,導(dǎo)致操作系統(tǒng)將當(dāng)前實(shí)例的狀態(tài)更改為ThreadState.Running。
26.? [.NET(C#)]構(gòu)造器Constructor是否可被override(重寫)敛惊?
答:構(gòu)造器Constructor不能被繼承渊鞋,因此不能重寫override,但可以被重載Overloade瞧挤。
27.? [.NET(C#)]靜態(tài)成員和抽象類
答:靜態(tài)成員override锡宋、virtual 或 abstract。
抽象類不能是密封的sealed或靜態(tài)的static特恬。
28.? ?[.NET(C#)]在C#中using和new這兩個(gè)關(guān)鍵字有什么意義执俩。
答:using 關(guān)鍵字有兩個(gè)主要用途:
1) 作為指令,用于為命名空間創(chuàng)建別名或?qū)肫渌臻g中定義的類型鸵鸥。
2) 作為語(yǔ)句奠滑,用于定義一個(gè)范圍,在此范圍的末尾將釋放對(duì)象妒穴。
new 關(guān)鍵字:新建實(shí)例或者隱藏父類方法
29.? [.NET(C#)].NET的錯(cuò)誤處理機(jī)制宋税。
答:.NET錯(cuò)誤處理機(jī)制采用try->catch->finally結(jié)構(gòu)。 throw
發(fā)生錯(cuò)誤時(shí)讼油,層層上拋杰赛,直到找到匹配的catch為止。
30.? [.NET(C#)]error和exception有什么區(qū)別矮台。
答:error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問(wèn)題乏屯。比如說(shuō)內(nèi)存溢出。
不可能指望程序能處理這樣的情況瘦赫。
exception 表示一種設(shè)計(jì)或?qū)崿F(xiàn)問(wèn)題辰晕。
也就是說(shuō),它表示如果程序運(yùn)行正常确虱,從不會(huì)發(fā)生的情況含友。
31.? [.NET(C#)]UDP連接和TCP連接的異同。
答:1) TCP(Transmission Control Protocol)傳輸控制協(xié)議:一種面向連接的校辩、可靠的窘问、基于字節(jié)流的運(yùn)輸層通信協(xié)議,三次握手宜咒。
2) UDP(User Datagram Protocol)用戶數(shù)據(jù)報(bào)協(xié)議:它不屬于連接型協(xié)議惠赫,因而具有資源消耗小,處理速度快的優(yōu)點(diǎn)故黑。缺點(diǎn)是易丟失數(shù)據(jù)包儿咱。
32.? [.NET(C#)]System.String 和System.StringBuilder有什么區(qū)別庭砍?
答:1) System.String是不可變的字符串。
2) System.StringBuilder存放了一個(gè)可變的字符串概疆,并提供一些對(duì)這個(gè)字符串修改的方法逗威。
3) String類在執(zhí)行字符串拼接的操作上,用“+”會(huì)產(chǎn)生新的對(duì)象岔冀,占用內(nèi)存凯旭。
4) StringBuilder類只是修改字符串的內(nèi)容,不建立新的對(duì)象使套。
33.? [.NET(C#)]const和readonly有什么區(qū)別罐呼?
答:1) const 字段只能在該字段的聲明中初始化。
2) 不允許在常數(shù)聲明中使用 static 修飾符侦高。
3) readonly 字段可以在聲明或構(gòu)造函數(shù)中初始化嫉柴。因此,根據(jù)所使用的構(gòu)造函數(shù)奉呛,readonly 字段可能具有不同的值计螺。
4) 另外,const 字段是編譯時(shí)常數(shù)瞧壮,而 readonly 字段可用于運(yùn)行時(shí)常數(shù)登馒。
34.? [.NET(C#)]C#中的委托是什么?事件是不是一種委托咆槽?
答:委托可以把一個(gè)方法作為參數(shù)代入另一個(gè)方法陈轿。
委托可以理解為指向一個(gè)函數(shù)的引用。
事件是一種特殊的委托秦忿。
35.? ?[.NET(C#)]什么是受管制的代碼麦射?
答:在類型或成員的聲明中使用 unsafe 修飾符。因此灯谣,類型或成員的整個(gè)正文范圍均被視為不安全上下文潜秋,無(wú)法由 CLR 進(jìn)行驗(yàn)證的代碼。
36.? ?[.NET(C#)]面向?qū)ο笳Z(yǔ)言三大特性胎许。
答:封裝峻呛、繼承、多態(tài)呐萨。
37.? [.NET(C#)]能用foreach遍歷訪問(wèn)的對(duì)象需要實(shí)現(xiàn)什么接口或聲明什么方法的類型杀饵。
答:聲明IEnumerable接口或?qū)崿F(xiàn)GetEnumerator()方法莽囤。
38.? [.NET(C#)]接口是否可繼承接口? 抽象類是否可實(shí)現(xiàn)(implements)接口? 抽象類是否可繼承實(shí)體類(concrete class)谬擦?
答:接口可以繼承接口。抽象類可以實(shí)現(xiàn)(implements)接口朽缎,抽象類是否可繼承實(shí)體類惨远,但前提是實(shí)體類必須有明確的構(gòu)造函數(shù)谜悟。
39.? [.NET(C#)]是否可以繼承String類?
答:String類是sealed類故不可以繼承北秽。
40.? [.NET(C#)]數(shù)組有沒(méi)有l(wèi)ength()這個(gè)方法? String有沒(méi)有l(wèi)ength()這個(gè)方法葡幸?
答:數(shù)組、String類都沒(méi)有Length()方法贺氓,它們只有Length屬性蔚叨。
41.? [.NET(C#)]成員變量和成員函數(shù)前加static的作用。
答:即使沒(méi)有創(chuàng)建類的實(shí)例辙培,也可以調(diào)用該類中的靜態(tài)方法蔑水、字段、屬性或事件扬蕊。如果創(chuàng)建了該類的任何實(shí)例搀别,不能使用實(shí)例來(lái)訪問(wèn)靜態(tài)成員。靜態(tài)成員通常用于表示不會(huì)隨對(duì)象狀態(tài)而變化的數(shù)據(jù)或計(jì)算尾抑。
42.? [.NET(C#)]什么是虛函數(shù)歇父?什么是抽象函數(shù)?
答:1) 虛函數(shù):沒(méi)有實(shí)現(xiàn)的再愈,可由子類繼承并重寫的函數(shù)榜苫。
2) 抽象函數(shù):規(guī)定其非虛子類必須實(shí)現(xiàn)的函數(shù),必須被重寫践磅。
43.? [.NET(C#)]C#中的三元運(yùn)算符是单刁?
答:?:府适。格式如下:ndition ? first_expression : second_expression羔飞。
44.? [.NET(C#)]當(dāng)整數(shù)a賦值給一個(gè)object對(duì)象時(shí),整數(shù)a將會(huì)被檐春?
答:裝箱逻淌。
45.? [.NET(C#)]委托聲明的關(guān)鍵字是?
答:delegate.
46.? ?[.NET(C#)]在.Net中所有可序列化的類都被標(biāo)記為疟暖?
答:[Serializable]
47.? ?[.NET(C#)]利用operator聲明且僅聲明了==卡儒,有什么錯(cuò)誤么?
答:要同時(shí)修改Equale和GetHash() ? 重載了"==" 就必須重載 "!="。
48.? [智力題] 62-63=1 等式不成立俐巴,請(qǐng)移動(dòng)一個(gè)數(shù)字(不可以移動(dòng)減號(hào)和等于號(hào))摹量,使得等式成立,如何移動(dòng)赢织?
答:62移動(dòng)成2的6次方揭鳞,26。
49.? [.NET(C#)]C#可否對(duì)內(nèi)存進(jìn)行直接的操作缘圈?
答:可以使用指針劣光。也就是非安全代碼袜蚕,就是不在 CLR 完全控制下執(zhí)行的代碼,它有可能會(huì)導(dǎo)致一些問(wèn)題绢涡,因此他們必須用 “unsafe” 進(jìn)行表明牲剃。
50.? ?[.NET(C#)] &和&&的區(qū)別。
&是位運(yùn)算符雄可,表示按位與運(yùn)算凿傅。
&&是邏輯運(yùn)算符,表示邏輯與(and)
51.? [.NET(C#)]重載的方法是否可以改變返回值的類型?
可以数苫。
52.? [.NET(C#)]如何把一個(gè)Array復(fù)制到ArrayList里狭归?
(1) 實(shí)現(xiàn)1
string[] s ={ "111", "22222" };
ArrayList list = new ArrayList();
list.AddRange(s);
(2)實(shí)現(xiàn)2
string[] s ={ "111", "22222" };
ArrayList list = new ArrayList(s);
53.? [.NET(C#)]什么是強(qiáng)名?
強(qiáng)名是由程序集的標(biāo)識(shí)加上公鑰和數(shù)字簽名組成的文判,其中过椎,程序集的標(biāo)識(shí)包括簡(jiǎn)單文本名稱、版本號(hào)和區(qū)域性信息(如果提供的話)戏仓。它使用對(duì)應(yīng)的私鑰從程序集文件中生成疚宇。(程序集文件包含程序集清單,其中包含組成程序集的所有文件的名稱和哈希赏殃。)
54.? [.NET(C#)]C#中幾種循環(huán)的方法敷待,并指出他們的不同:
1. for:使用于確定次數(shù)的循環(huán)。
2. foreach:使用于遍歷的元素是只讀的仁热。//Unity中此處是個(gè)坑榜揖,建議不要用foreach
3. while:次數(shù)不確定,條件隨機(jī)變化抗蠢。
4. do...while:次數(shù)不確定举哟,條件隨機(jī)變化,但至少要保證能被執(zhí)行一次迅矛。
55.? [.NET(C#)]請(qǐng)簡(jiǎn)述一下用Socket進(jìn)行同步通訊編程的詳細(xì)步驟
1. 在應(yīng)用程序和遠(yuǎn)程設(shè)備中使用協(xié)議和網(wǎng)絡(luò)地址初始化套接字妨猩。
2. 在應(yīng)用程序中通過(guò)指定端口和地址建立監(jiān)聽(tīng)。
3. 遠(yuǎn)程設(shè)備發(fā)出連接請(qǐng)求秽褒。
4. 應(yīng)用程序接受連接產(chǎn)生通信scoket壶硅。
5. 應(yīng)用程序和遠(yuǎn)程設(shè)備開(kāi)始通訊(在通訊中應(yīng)用程序?qū)炱鹬钡酵ㄓ嵔Y(jié)束)。
6. 通訊結(jié)束销斟,關(guān)閉應(yīng)用程序和遠(yuǎn)程設(shè)備的Socket回收資源庐椒。
56.? [.NET(C#)] try {}里有一個(gè)return語(yǔ)句,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不會(huì)被執(zhí)行蚂踊,什么時(shí)候被執(zhí)行约谈,在return前還是后?
答:會(huì)執(zhí)行,在return前執(zhí)行。
57.? [.NET(C#)] 寫出程序的輸出結(jié)果:
publicclassA
{publicvirtualvoidFun1(inti )
{
Console.WriteLine( i );
}publicvoidFun2( A a )
{
a.Fun1(1);
Fun1(5);
}
}publicclassB : A
{publicoverridevoidFun1(inti )
{base.Fun1( i +1);
}publicstaticvoidMain()
{
B b=newB();
A a=newA();
a.Fun2( b );
b.Fun2( a );
}
}
答案:
2
5
1
6
58.? [.NET(C#)]求以下表達(dá)式的值窗宇,寫出您想到的一種或幾種實(shí)現(xiàn)方法:1 - 2 + 3 - 4 +......+ m
答案:
publicstaticvoidMain()
{intinput =int.Parse( Console.ReadLine() );intsum =0;for(inti =0; i <= input; i++)
{if( ( i %2) ==1)
{
sum+=i;
}else{
sum= sum -i;
}
}
Console.WriteLine( sum );
}
59.? ?[.NET(C#)]兩個(gè)對(duì)象值相同(x.equals(y) == true),但卻可有不同的hash code特纤,這句話對(duì)不對(duì)?
答:不對(duì)军俊,有相同的hash code。
60.? [.NET(C#)] swtich是否能作用在byte上捧存,是否能作用在long上粪躬,是否能作用在String上?
答案:可以作用在byte和long上,也可以作用在string上昔穴。
61.? [.NET(C#)] short s1 = 1; s1 = s1 + 1;有什么錯(cuò)镰官?short s1 = 1; s1 += 1;有什么錯(cuò)?
答: 1. short s1 = 1; s1 = s1 + 1;有錯(cuò)吗货,s1是short型泳唠,s1+1是int型,不能隱式轉(zhuǎn)化為short型宙搬”啃龋可修改為s1 =(short)(s1 + 1) 。
2. short s1 = 1; s1 += 1正確勇垛。
62.? ?[.NET(C#)] 字符串處理問(wèn)題
題目:需要實(shí)現(xiàn)對(duì)一個(gè)字符串的處理脖母,首先將該字符串首尾的空格去掉,如果字符串中間還有連續(xù)空格的話闲孤,僅保留一個(gè)空格谆级,即允許字符串中間有多個(gè)空格,但連續(xù)的空格數(shù)不可超過(guò)一個(gè)讼积。
答案:
string inputStr = " xx xx ";
inputStr = Regex.Replace( inputStr.Trim(), @"/s+", " " );
63.? [.NET(C#)]下面這段代碼輸出什么肥照?為什么?
int i = 5;
int j = 5;
if( Object.ReferenceEquals( i, j ) )
Console.WriteLine( "Equal" );
else
Console.WriteLine( "Not Equal" );
答案:Not Equal勤众。因?yàn)楸容^的是對(duì)象
64.? [.NET(C#)] public static const int A=1;這段代碼有錯(cuò)誤么建峭?是什么?
答:const不能用static修飾决摧。
65.? ?[.NET(C#)]下面的代碼中有什么錯(cuò)誤嗎亿蒸?
class A
{
public virtual void F()
{
Console.WriteLine( "A.F" );
}
}
abstract class B : A
{
public abstract override void F();//abstract與override關(guān)鍵字可以同時(shí)使用
}
答案:沒(méi)有錯(cuò)誤!可以通過(guò)編譯器掌桩。
注意:網(wǎng)上有資料說(shuō)abstract與override關(guān)鍵字不可以同時(shí)使用边锁,這種說(shuō)法是錯(cuò)誤的 !
66.? [.NET(C#)] 以下是一些C#中的枚舉型的定義波岛,其中錯(cuò)誤的用法有?
A. public enum var1{ Mike = 100, Nike = 102, Jike }
B. public enum var1{ Mike = “1”, Nike, Jike }
C. public enum var1{ Mike=-1 , Nike, Jike }
D. public enum var1{ Mike , Nike , Jike }
答案B
67.???? [.NET(C#)] 下面的例子中產(chǎn)生的輸出結(jié)果是什么茅坛?
class A
{
public static int X;
static A()
{
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B()
{
}
static void Main()
{
Console.WriteLine( "X={0},Y={1}", A.X, B.Y );
}
}
答:x=1,y=2
68.? [.NET(C#)] 寫出程序的輸出結(jié)果
class Class1
{
private string str = "Class1.str";
private int i = 0;
static void StringConvert( string str )
{
str = "string being converted.";
}
static void StringConvert( Class1 c )
{
c.str = "string being converted.";
}
static void Add( int i )
{
i++;
}
static void AddWithRef( ref int i )
{
i++;
}
static void Main()
{
int i1 = 10;
int i2 = 20;
string str = "str";
Class1 c = new Class1();
Add( i1 );
AddWithRef( ref i2 );
Add( c.i );
StringConvert( str );
StringConvert( c );
Console.WriteLine( i1 );
Console.WriteLine( i2 );
Console.WriteLine( c.i );
Console.WriteLine( str );
Console.WriteLine( c.str );
}
}
答案:10, 21, 0, str, string being converted
注意:此處加逗號(hào)“,”是為了答案看起來(lái)清晰,實(shí)際結(jié)果是縱向排列的贡蓖,因?yàn)檎{(diào)用了Console.WriteLine()曹鸠。
69.? [.NET(C#)] 寫出程序的輸出結(jié)果
public abstract class A
{
public A()
{
Console.WriteLine( ‘A‘ );
}
public virtual void Fun()
{
Console.WriteLine( "A.Fun()" );
}
}
public class B : A
{
public B()
{
Console.WriteLine( ‘B‘ );
}
public new void Fun()
{
Console.WriteLine( "B.Fun()" );
}
public static void Main()
{
A a = new B();
a.Fun();
}
}
答案:
A
B
A.Fun()
70.? [C#語(yǔ)言基礎(chǔ)]簡(jiǎn)述string與StringBuilder相比的優(yōu)點(diǎn)。
答:
string的字符串為常量不可修改斥铺。
1.可以滿足字符串常量池的需要彻桃。即對(duì)于創(chuàng)建相同文本時(shí),string為同一對(duì)象晾蜘。
2.允許string對(duì)象緩存HashCode邻眷。字符串不變形保證了hash碼的唯一性。
3.安全性剔交,string被許多的類庫(kù)用來(lái)當(dāng)做參數(shù)肆饶。
StringBuilder實(shí)際是一個(gè)char類型的集合,完成了組裝拼接等工作岖常。
String更適合做程序的參數(shù)驯镊,StringBuilder用于做String類型的組裝。
71.? [C#語(yǔ)言基礎(chǔ)]C#StringBuilder類型比string類型的優(yōu)勢(shì)是什么竭鞍?
答:
StringBuilder的優(yōu)勢(shì)在于拼接字符串阿宅。
//String的優(yōu)勢(shì)在于對(duì)字符串做一些處理,在使用過(guò)程中看具體的需求笼蛛。
72.? ?[C#語(yǔ)言基礎(chǔ)]編寫程序判斷整數(shù)46234的每位相加和洒放。
答:
int number = 46234;
string strNumber=number.ToString();
int length = strNumber.Length;
方法1:
int result=0;
for (int i = 0; i < length; i++)
{
result += number % 10;
number \= 10;
}
方法2:
for (int i = 0; i < length; i++)
{
result += number / (int)Math.Pow(10, i) % 10;
}
方法3:
for (int i = 0; i < strNumber.Length; i++)
{
result += int.Parse(strNumber[i].ToString());
}
注:
73.? [算法]請(qǐng)使用冒泡排序,對(duì)一維數(shù)組進(jìn)行降序排列滨砍。
答:
冒泡排序:它重復(fù)地走訪過(guò)要排序的數(shù)列往湿,一次比較兩個(gè)元素,如果它們的順序錯(cuò)誤就把他們交換過(guò)來(lái)惋戏。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換领追。
冒泡排序算法的運(yùn)作如下:
l? 比較相鄰元素。如果第一個(gè)比第二個(gè)大响逢,就交換它們绒窑。
l? 對(duì)每一對(duì)相鄰元素做同樣的工作,從開(kāi)始第一隊(duì)到結(jié)尾的最后一對(duì)舔亭。在這一點(diǎn)些膨,最后的元素會(huì)使最大的數(shù)。
l? 針對(duì)所有的元素重復(fù)以上的步驟钦铺,除了最后一個(gè)订雾。
l? 持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟,知道沒(méi)有任何一對(duì)數(shù)字需要比較矛洞。
寫法1
public void Bubble1(int[] a)
{
bool b;
int tmp;
for (int i = 0; i < a.Length; i++)
{
b = false;
for (int j = i+1; j < a.Length ; j++)
{
if (a[j] > a[i])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
b = true;
}
}
if(!b)break;
}
}
寫法2
void Bubble2(int[] a)
{
bool b=false;
int tmp;
for(int i=0;i
{
b=false;
for(int j=0;j
{
if(a[j]
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
b=true;
}
}
if(!b) break;
}
}
寫法3
void Bubble3(int[] a)
{
bool b=true;
int j=0;
int temp;
do
{
b=false;
for(int i;i
{
if(a[i]
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
b=true;
}
}
j++;
}
while(b);
}
74.? ?[C#語(yǔ)言基礎(chǔ)][值類型引用類型]以下代碼輸出結(jié)果是什么洼哎?原因是什么?
object o1 = 1;
object o2 = o1;
o1 = 2;
Console.WriteLine(o2);
答:
1;
原因:o1將數(shù)據(jù)1在堆中引用賦值給o2,而后又將引用指向數(shù)據(jù)2噩峦,故o2仍指向數(shù)據(jù)1的引用锭沟。
75.? [C#語(yǔ)言基礎(chǔ)]請(qǐng)寫出定義方法的語(yǔ)法。
答:
[訪問(wèn)修飾符][可選修飾符] 返回類型 方法名稱(參數(shù)列表)
{
//方法體识补;
return 結(jié)果族淮;
}
76.? [C#語(yǔ)言基礎(chǔ)]請(qǐng)簡(jiǎn)述string字符串不可變性的原因?
答:
在很多語(yǔ)言當(dāng)中如Java\C#中字符串string被設(shè)計(jì)成具有不可變性的李请。從系統(tǒng)優(yōu)化方面考慮這樣的設(shè)計(jì)好處主要由三點(diǎn)。
首先厉熟,它允許在一個(gè)字符串上執(zhí)行各種操作导盅,而不實(shí)際地更改字符串。
字符串不可變揍瑟,還因?yàn)檫@在操作或訪問(wèn)一個(gè)字符串時(shí)不會(huì)發(fā)成線程同步問(wèn)題白翻。
除此之外,CLR可通過(guò)一個(gè)String對(duì)象共享多個(gè)完全一致的String內(nèi)容绢片。這樣能減少系統(tǒng)中的字符串?dāng)?shù)量滤馍,者正是字符串留用技術(shù)的目的。
1.字符串常量池的需要底循。字符串常量池是內(nèi)存堆中一個(gè)特殊的存儲(chǔ)區(qū)域巢株,當(dāng)創(chuàng)建一個(gè)string對(duì)象時(shí),假設(shè)此字符串值已經(jīng)存在于常量池中熙涤,則不會(huì)創(chuàng)建一個(gè)新的對(duì)象阁苞,而是引用已經(jīng)存在的對(duì)象。
2.允許string對(duì)象緩存HashCode祠挫。字符串不變性保證了hash碼的唯一性那槽,因此可以放心地進(jìn)行緩存,這是一種性能優(yōu)化手段等舔,因?yàn)檫@不必每次都去計(jì)算新的哈希碼骚灸。
3.安全性。string被許多的類庫(kù)用來(lái)當(dāng)做參數(shù)慌植,例如網(wǎng)絡(luò)連接URL甚牲,文件路徑Path,還有反射機(jī)制所需要的String參數(shù)等蝶柿,假若string可變的鳖藕,將會(huì)引起各種安全隱患。
綜上只锭,string不可變的原因包括設(shè)計(jì)考慮著恩,效率優(yōu)化問(wèn)題,以及安全性三大方面。
另:在C++中string類型是可變的喉誊。
77.? [C#語(yǔ)言基礎(chǔ)]請(qǐng)簡(jiǎn)述方法重載OverLoad?
答:
方法名稱相同邀摆,但參數(shù)列表不同稱為方法重載。用于在不同條件下解決同一類型的問(wèn)題伍茄。
78.? [C#語(yǔ)言基礎(chǔ)]請(qǐng)給出以下代碼輸出結(jié)果:
class A
{
public static int a;
static A()
{
a = B.b + 1;
}
}
class B
{
public static int b;
static B()
{
b = A.a + 1;
}
}
static void Main()
{
Console.WriteLine(A.a);
Console.WriteLine(B.b);
}
答:2? ,1
79.? [C#語(yǔ)言基礎(chǔ)]請(qǐng)給出以下代碼輸出結(jié)果:
class C
{
public static int a;
public C()
{
a++;
}
static C()
{
a++;
}
}
static void Main()
{
C c1 = new C();
C c2 = new C();
C c3 = new C();
Console.WriteLine(C.a);
}
答:4
80.? [C#語(yǔ)言基礎(chǔ)]在類的構(gòu)造函數(shù)前加上static會(huì)報(bào)什么錯(cuò)栋盹?為什么?
答:
靜態(tài)函數(shù)沒(méi)有訪問(wèn)修飾符敷矫,其他C#代碼從來(lái)不調(diào)用它例获,但在加載類時(shí),總是由.NET運(yùn)行庫(kù)調(diào)用它曹仗,所以像public或private這樣的訪問(wèn)修飾符就沒(méi)有任何意義榨汤。出于同樣原因,靜態(tài)構(gòu)造函數(shù)不能帶任何參數(shù)怎茫,一個(gè)類也只能有一個(gè)靜態(tài)構(gòu)造函數(shù)收壕。靜態(tài)構(gòu)造函數(shù)只能訪問(wèn)類的靜態(tài)成員,不能訪問(wèn)類的實(shí)例成員轨蛤。
也就是說(shuō)只加static不會(huì)報(bào)錯(cuò)蜜宪,加了static再加了別的就會(huì)報(bào)錯(cuò)。
81.? ?[C#語(yǔ)言基礎(chǔ)]C#函數(shù)Func(string a,string b)用Lambda表達(dá)式怎么寫祥山?
答:(a,b)=>{}
注:該題有兩種錯(cuò)誤可能:
一種是方法沒(méi)有些返回值即Func(string a,string b)為 void Func(string a,string b)此時(shí)圃验,Lambda表達(dá)式可寫作(a,b)=>{}
一種是Func為Func此時(shí)Lambda可寫作a=>b//a,b為string類型
82.? [C#語(yǔ)言基礎(chǔ)]數(shù)列1,1,2,3,5,8,13...第n為數(shù)是多少?用C#遞歸算法實(shí)現(xiàn)缝呕。答:
public static int Fibonacci(int num)//Fibonacci
{
return (num==0||num==1)?1:(Fibonacci(num-2)+Fibonacci(num-1));
}
注:計(jì)算斐波那契數(shù)列依據(jù)數(shù)列定義來(lái)建立方法是不推薦的寫法损谦。因?yàn)榇藭r(shí)計(jì)算第n位的數(shù)的時(shí)間復(fù)雜度為O((3/2)n)。相比較而言岳颇,利用循環(huán)可以將時(shí)間復(fù)雜度縮小到O(n)該方法較為實(shí)用照捡,而且實(shí)現(xiàn)簡(jiǎn)單,在沒(méi)有特殊要求的情況下屬于建議的寫法话侧。另一種優(yōu)化的寫法可以將時(shí)間復(fù)雜度優(yōu)化到O(logn)栗精,實(shí)現(xiàn)代碼較復(fù)雜,且隱含的時(shí)間常數(shù)較大瞻鹏。但適合面試者展示其知識(shí)面和代碼實(shí)現(xiàn)的能力悲立。
兩種寫法如下:
寫法一:
public long Fibonacci1(int num)
{
return (num==0||num==1)?1:(Fibonacci1(num-2)+Fibonacci1(num-1));
}
寫法二:
public long Fibonacci2(int num)
{
int result[2]={0,1};
if(n<2)
return result[n];
long fibOne=1;
long fibTwo=0;
long fibN=0;
for(int i=2;i<=n;i++)
{
fibN=fibOne+fibTwo;
fibTwo=fibOne;
fibOne=fibN;
}
return fibN;
}
83.? [C#語(yǔ)言基礎(chǔ)]請(qǐng)簡(jiǎn)述值類型和引用類型的區(qū)別。
答:
從概念上區(qū)分新博,值類型時(shí)直接存儲(chǔ)其值薪夕,而引用類型是存儲(chǔ)對(duì)值的引用。
實(shí)際中赫悄,對(duì)于值類型的對(duì)象原献,初始化一個(gè)實(shí)例馏慨,該實(shí)例代表的是其內(nèi)部存儲(chǔ)的數(shù)據(jù)本身。而引用類型的對(duì)象姑隅,初始化一個(gè)實(shí)例写隶,該實(shí)例代表的是其初始化數(shù)據(jù)在內(nèi)存當(dāng)中的引用。
值類型隱式繼承自System.ValueType.該類為抽象類讲仰,只能序列化慕趴,不能被顯式繼承。
值類型:枚舉鄙陡,結(jié)構(gòu)
引用類型:數(shù)組冕房,委托,類趁矾,接口
84.? [C#語(yǔ)言基礎(chǔ)]請(qǐng)簡(jiǎn)述ArrayList和List<>的主要區(qū)別
答:
ArrayList是非泛型列表耙册,存儲(chǔ)數(shù)據(jù)是把所有的數(shù)據(jù)都當(dāng)成object類型數(shù)據(jù),存在裝箱問(wèn)題愈魏,取出來(lái)使用的時(shí)候存在拆箱問(wèn)題觅玻,裝箱拆箱會(huì)使性能變差想际,而且存在數(shù)據(jù)安全問(wèn)題培漏,但是優(yōu)點(diǎn)在于可以讓值類型和引用類型相互轉(zhuǎn)換。
List是泛型列表胡本,在使用的時(shí)候才會(huì)去定義數(shù)據(jù)類型牌柄,泛型避免了拆裝箱的問(wèn)題,存入讀取熟讀較快侧甫,類型也更安全珊佣。
85.? [C#語(yǔ)言基礎(chǔ)]請(qǐng)簡(jiǎn)述GC(垃圾回收)產(chǎn)生的原因,并描述如何避免披粟?
解析:首先咒锻,這道題的描述是不嚴(yán)謹(jǐn)?shù)模珿C作為CLR的一種機(jī)制是由系統(tǒng)調(diào)用的守屉,只要運(yùn)行與CLR上的托管代碼GC的工作本身是不可避免的惑艇。
但是拋開(kāi)這些細(xì)節(jié)不談,我可以在這里寫把我認(rèn)為這道題可能涉及到的東西寫一下拇泛。
如果只把GC理解成一種可以自動(dòng)釋放內(nèi)存的方式滨巴,使程序員省去了手動(dòng)釋放內(nèi)存的煩惱,或試圖引用已釋放的內(nèi)存空間的錯(cuò)誤俺叭,這無(wú)疑是片面的恭取,雖然這的確是GC非常重要的功能。但GC的作用遠(yuǎn)不如此熄守。
GC的產(chǎn)生是與CLR堆內(nèi)存特殊的分配方式有關(guān)的蜈垮。CLR要求所有的資源都從托管堆分配耗跛,托管堆有一個(gè)指針NextObjPtr它的初始為保留地址空間的基地址。NextObjPtr指向下一個(gè)對(duì)象在堆中的分配位置窃款。每當(dāng)添加一個(gè)對(duì)象课兄,NextObjPtr指針的值就會(huì)加上對(duì)象占據(jù)的字節(jié)數(shù)。這樣做有兩個(gè)好處:
首先晨继,在許多應(yīng)用程序中烟阐,差不多同時(shí)分配的對(duì)象彼此間有較強(qiáng)的聯(lián)系,而且經(jīng)常差不多在同一時(shí)間訪問(wèn)紊扬。在垃圾回收環(huán)境中蜒茄,如果對(duì)象在內(nèi)存中連續(xù)分配,會(huì)由于引用的本地性而獲得性能上的提升餐屎。具體地說(shuō)檀葛,這意味著進(jìn)程的工作集小于非托管環(huán)境中運(yùn)行相似的應(yīng)用程序。
另一方面腹缩,這意味著代碼使用的對(duì)象可以全部駐留在CPU的緩存中屿聋,加快CPU對(duì)這些對(duì)象的訪問(wèn)速度。
但托管堆具有這些好處藏鹊,是因?yàn)樗隽艘粋€(gè)相當(dāng)大膽的假設(shè)润讥,地址的空間和存儲(chǔ)是無(wú)限的。那么如何讓它由假設(shè)變?yōu)榭蓪?shí)現(xiàn)的盘寡,這就是GC垃圾回收的工作楚殿。
GC的垃圾回收算法是基于世代法和啟發(fā)式算法的。
世代法是指將堆分為0代竿痰,1代脆粥,2代。每當(dāng)0代的堆滿時(shí)就觸發(fā)一次垃圾回收影涉。當(dāng)?shù)?代的的內(nèi)存并沒(méi)被釋放变隔,就會(huì)被提升到1代,如果1代在被回收時(shí)仍然保留的內(nèi)存蟹倾,就會(huì)被提升到2代匣缘。這樣壓縮空間的的方法保證了堆內(nèi)存的連續(xù)性,增加了訪問(wèn)對(duì)象的速度喊式。而啟發(fā)式算法是指在基于應(yīng)用程序?qū)π陆▽?duì)象的模式孵户,進(jìn)行啟發(fā)式的對(duì)第1代,第2代堆進(jìn)行釋放岔留,或擴(kuò)大第0代的堆空間夏哭。
建議只有在以下兩種情況下才調(diào)用Dispose或Close:確定必須清理資源;或者確定可以安全地調(diào)用Dispose或Close献联,并希望將對(duì)象從中介列表中刪除竖配,禁止對(duì)象提升(到另一代)從而提高性能何址。
那么避免因?yàn)镚C過(guò)程而影響性能的編程方法如下:
因?yàn)镚C的目標(biāo)引用地址都是存在棧上的,所以盡量不要用太深的棧进胯,比如遞歸用爪。
合理的使用new避免不必要的對(duì)象新建次數(shù)。
不要一次性大量申請(qǐng)內(nèi)存胁镐。
對(duì)運(yùn)行時(shí)string對(duì)象盡量不要使用+來(lái)構(gòu)建偎血,而要用StringBuilder
86.? ?[C#語(yǔ)言基礎(chǔ)]請(qǐng)描述Interface接口與abstract抽象類之間的不同。
答:
語(yǔ)法不同:
1.抽象類中可以有字段盯漂,接口沒(méi)有颇玷。
2.抽象類中可以有實(shí)現(xiàn)成員,接口只能包含抽象成員就缆。
3.抽象類中所有成員修飾符都可以使用帖渠,接口中所有的成員都是對(duì)外的,所以不需要修飾符修飾竭宰。
用法不同:
1.抽象類是概念的抽象空郊,接口關(guān)注與行為。
2.抽象類的子類與父類的關(guān)系是泛化關(guān)系切揭,耦合度較高狞甚,而實(shí)現(xiàn)類和接口之間是實(shí)現(xiàn)關(guān)系,耦合度比泛化低伴箩。
3.一個(gè)類只能繼承自一個(gè)類入愧,但是可以實(shí)現(xiàn)多個(gè)接口鄙漏。
87.? ?[C#語(yǔ)言基礎(chǔ)]下列代碼在運(yùn)行時(shí)會(huì)產(chǎn)生幾個(gè)臨時(shí)對(duì)象嗤谚?
string a="abc";//1個(gè)對(duì)象
a=(a.ToUpper()+"123").Substring(0,2);
答:三個(gè)臨時(shí)對(duì)象
注:string a="abc";//1個(gè)對(duì)象
a=(a.ToUpper()+"123").Substring(0,2);
a.ToUpper()//1個(gè)臨時(shí)對(duì)象
"123"http://1個(gè)臨時(shí)對(duì)象
a.ToUpper()+"123"http://1臨時(shí)個(gè)對(duì)象
.Substring(0,2)//1個(gè)對(duì)象由于它將引用賦給了a所以它不是臨時(shí)對(duì)象
在語(yǔ)句運(yùn)行時(shí)結(jié)束后不存在引用的對(duì)象。
88.? [C#語(yǔ)言基礎(chǔ)]下列代碼在運(yùn)行中會(huì)發(fā)生什么問(wèn)題怔蚌?如何避免巩步?
List Is=new List(new int[]{1,2,3,4,5});
foreach(int item in Is)
{
Console.WriteLine(item*item);
Is.Remove(item);
}
答:會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,拋出一個(gè)InvalidOperationException異常桦踊,因?yàn)閒oreach是只讀的椅野。不能一邊遍歷一邊修改。使用foreach時(shí)候不要對(duì)內(nèi)容進(jìn)行修改籍胯。
89.? [C#語(yǔ)言基礎(chǔ)]請(qǐng)簡(jiǎn)述關(guān)鍵字Sealed用在類聲明和函數(shù)(方法)聲明時(shí)的作用竟闪?
答:sealed訪問(wèn)修飾符用于類時(shí),表示該類不能被繼承杖狼;對(duì)于方法表示不能重寫該方法炼蛤。當(dāng)應(yīng)用于方法或?qū)傩詴r(shí),sealed 修飾符必須始終與 override 一起使用蝶涩。
注:
若要確定是否密封類理朋、方法或?qū)傩孕跏叮ǔ?yīng)考慮以下兩點(diǎn):
派生類利用自定義類的功能所獲得的可能好處。
派生類在修改類之后導(dǎo)致其無(wú)法正常工作或按預(yù)期工作的可能性嗽上。
90.? [C#語(yǔ)言基礎(chǔ)]請(qǐng)簡(jiǎn)述private次舌,public,protected兽愤,internal的區(qū)別彼念?
答:public:對(duì)任何類和成員都公開(kāi),無(wú)限制訪問(wèn)
private:僅對(duì)該類公開(kāi)
protected:對(duì)該類和其他派生類公開(kāi)
internal:只能在包含該類的程序集中訪問(wèn)該類
protected internal:protected+internal
注:
可見(jiàn)性修飾符:
修飾符
應(yīng)用于
說(shuō)明
public
所有類型或成員
任何代碼均可以訪問(wèn)該項(xiàng)
protected
類型和內(nèi)嵌類型的所有成員
只有派生的類型能夠訪問(wèn)該項(xiàng)
internal
所有類型或成員
只能在包含它的程序集中訪問(wèn)該項(xiàng)
prvate
類型和內(nèi)嵌類型的所有成員
只能在它所述的類型中訪問(wèn)該項(xiàng)
protected internal
類型和內(nèi)嵌類型的所有成員
只能在包含它的程序集和派生類型的代碼中訪問(wèn)該項(xiàng)浅萧。
其他修飾符
修飾符
應(yīng)用于
說(shuō)明
new
函數(shù)成員
成員用相同的簽名隱藏繼承的成員
static
所有成員
成員不作用于類的具體實(shí)例
virtual
僅函數(shù)成員
成員可以由派生類重寫
abstract
僅函數(shù)成員
虛擬成員定義了成員的簽名国拇,但沒(méi)有提供實(shí)現(xiàn)代碼
override
僅函數(shù)成員
成員重寫了繼承的而虛擬或抽象成員
sealed
類、方法和屬性
對(duì)于類惯殊,不能繼承自密封類酱吝。對(duì)于屬性和方法,成員重寫已繼承的虛擬成員土思,但任何派生類中的任何成員都不能重寫該成員务热。當(dāng)應(yīng)用于方法或?qū)傩詴r(shí),sealed 修飾符必須始終與 override 一起使用己儒。
extern
僅靜態(tài)[DllImport]方法
成員在外部用另一種語(yǔ)言實(shí)現(xiàn)
91.? [C#語(yǔ)言基礎(chǔ)]反射的實(shí)現(xiàn)原理崎岂?
答:審查元數(shù)據(jù)并收集關(guān)于它的類型信息的能力。
注:
公共語(yǔ)言運(yùn)行時(shí)程序管理應(yīng)用程序域闪湾,應(yīng)用程序域構(gòu)成具有相同應(yīng)用程序范圍的對(duì)象周圍定義的邊界冲甘。 此管理包括將每個(gè)程序集加載到相應(yīng)的應(yīng)用程序域中和控制每個(gè)程序集內(nèi)的類型層次結(jié)構(gòu)的內(nèi)存布局。
程序集包含模塊途样、模塊包含類型江醇,而類型包含成員。 反射提供封裝程序集何暇、模塊和類型的對(duì)象陶夜。 可以使用反射動(dòng)態(tài)地創(chuàng)建類型的實(shí)例,將類型綁定到現(xiàn)有對(duì)象裆站,或從現(xiàn)有對(duì)象中獲取類型条辟。然后,可以調(diào)用類型的方法或訪問(wèn)其字段和屬性宏胯。
Reflection羽嫡,中文翻譯為反射。
這是.Net中獲取運(yùn)行時(shí)類型信息的方式肩袍,.Net的應(yīng)用程序由幾個(gè)部分:‘程序集(Assembly)’杭棵、‘模塊(Module)’、‘類型(class)’組成了牛,而反射提供一種編程的方式颜屠,讓程序員可以在程序運(yùn)行期獲得這幾個(gè)組成部分的相關(guān)信息辰妙,例如:
Assembly類可以獲得正在運(yùn)行的裝配件信息,也可以動(dòng)態(tài)的加載裝配件甫窟,以及在裝配件中查找類型信息密浑,并創(chuàng)建該類型的實(shí)例。
Type類可以獲得對(duì)象的類型信息粗井,此信息包含對(duì)象的所有要素:方法尔破、構(gòu)造器、屬性等等浇衬,通過(guò)Type類可以得到這些要素的信息懒构,并且調(diào)用之。
MethodInfo包含方法的信息耘擂,通過(guò)這個(gè)類可以得到方法的名稱胆剧、參數(shù)、返回值等醉冤,并且可以調(diào)用之秩霍。
諸如此類,還有FieldInfo蚁阳、EventInfo等等铃绒,這些類都包含在System.Reflection命名空間下。
92.
[C#語(yǔ)言基礎(chǔ)].NET與Mono的關(guān)系螺捐?
答:MONO是.NET的一個(gè)開(kāi)源跨平臺(tái)工具颠悬。.NET只能在Windows下運(yùn)行,Mono可以實(shí)現(xiàn)跨平臺(tái)定血,可以運(yùn)行與Linux,Unix,Mac OS等赔癌。
93.
[面對(duì)對(duì)象]請(qǐng)說(shuō)出4中面向?qū)ο蟮脑O(shè)計(jì)原則,并分別簡(jiǎn)述它們的含義糠悼。
答:
1)單一職責(zé)原則:一個(gè)類届榄,最好只做一件事浅乔,只有一個(gè)引起它的變化倔喂。
2)開(kāi)放-封閉原則:對(duì)于擴(kuò)展是開(kāi)放的,對(duì)于更改是封閉的靖苇。
3)里氏替換原則:子類必須能夠替換其基類席噩。
4)依賴倒置原則:設(shè)計(jì)應(yīng)該依賴于抽象而不是具體實(shí)現(xiàn)。
A.高層模塊不應(yīng)該依賴底層模塊贤壁,兩個(gè)都應(yīng)該依賴抽象悼枢。
B.抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象(要對(duì)抽象編程脾拆,不要對(duì)實(shí)現(xiàn)編程馒索。)
5)接口隔離原則:使用多個(gè)小的專門的接口而不要使用一個(gè)大的總接口莹妒。
6)迪米特法則:如果兩個(gè)類不彼此直接通信,那么這兩個(gè)類就不應(yīng)當(dāng)發(fā)生直接的相互作用绰上。如果其中一個(gè)類需要調(diào)用另一個(gè)類的某一個(gè)方法的話旨怠,可以通過(guò)第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用。
7)合成/聚合復(fù)用原則:盡量使用合成/聚合蜈块,盡量不要使用類繼承鉴腻。
注:
94.
[C#語(yǔ)言基礎(chǔ)]Hashtable是無(wú)序的嗎?
答:電腦沒(méi)有絕對(duì)的無(wú)序百揭,hashtable是通過(guò)哈希碼讓開(kāi)發(fā)者感覺(jué)無(wú)序爽哎。
注:這里的無(wú)序是指集合的添加順序與其輸出順序無(wú)關(guān)。Hashtable是通過(guò)哈希碼或哈希函數(shù)器一,對(duì)其內(nèi)部元素進(jìn)行排列的课锌,所以其元素的添加順序與其輸出順序無(wú)關(guān)。
95.
[設(shè)計(jì)模式]請(qǐng)描述你所了解的設(shè)計(jì)模式祈秕,并說(shuō)明在你的項(xiàng)目中哪里使用過(guò)产镐?
答:
單例: 對(duì)象池,游戲管理器
抽象工廠踢步,
狀態(tài):有限狀態(tài)機(jī)癣亚,
橋接:有限狀態(tài)機(jī)
策略:AI自動(dòng)行為操控中每種操控算法的獨(dú)例
注:擴(kuò)展補(bǔ)充。
創(chuàng)建型模式:?jiǎn)卫J健?a target="_blank" rel="nofollow">抽象工廠模式获印、建造者模式述雾、工廠模式、原型模式兼丰。
結(jié)構(gòu)型模式:適配器模式玻孟、橋接模式、裝飾模式鳍征、組合模式黍翎、外觀模式、享元模式艳丛、代理模式匣掸。
行為型模式:模版方法模式、命令模式氮双、迭代器模式碰酝、觀察者模式、中介者模式戴差、備忘錄模式送爸、解釋器模式(Interpreter模式)、狀態(tài)模式、策略模式袭厂、職責(zé)鏈模式(責(zé)任鏈模式)墨吓、訪問(wèn)者模式。
96.
[數(shù)據(jù)結(jié)構(gòu)]說(shuō)出你所了解的數(shù)據(jù)結(jié)構(gòu)纹磺,并說(shuō)明它們的特點(diǎn)肛真。
答:列表:
特點(diǎn):有序,內(nèi)存空間連續(xù)爽航,讀取速度快蚓让,大小可變,通過(guò)位置索引取元素.
缺點(diǎn):輸入讥珍,刪除的速度慢
類庫(kù)已實(shí)現(xiàn):List历极、
ArrayList
字典:
特點(diǎn):鍵值對(duì)的集合,通過(guò)鍵查找值衷佃,查找方便趟卸,無(wú)序
類庫(kù)已實(shí)現(xiàn):Dictionary、Hashtable
棧:
特點(diǎn):后進(jìn)前出 LIFO(Last
In First Out)
支持操作:入棧氏义,出棧锄列,讀棧頂,
類庫(kù)已實(shí)現(xiàn):Stack惯悠、Stack
隊(duì)列:
特點(diǎn):前進(jìn)前出 FIFO(First In First Out)
支持操作:入隊(duì)邻邮,出隊(duì),讀隊(duì)首
類庫(kù)已實(shí)現(xiàn):Queue克婶、Queue
鏈表:
特點(diǎn):節(jié)點(diǎn)內(nèi)存空間不連續(xù)筒严,插入,刪除速度快情萤,讀取速度慢.
類庫(kù)已實(shí)現(xiàn):LinkedList
數(shù)組:
特點(diǎn):內(nèi)存空間連續(xù)达传,長(zhǎng)度固定忙厌,讀取速度快
類庫(kù)已實(shí)現(xiàn):Array
樹(shù):
特點(diǎn):可以將對(duì)象組織為層次結(jié)構(gòu)藻糖,
實(shí)現(xiàn):可使用設(shè)計(jì)模式中的組合模式實(shí)現(xiàn)樹(shù)結(jié)構(gòu)
97.
[C#語(yǔ)言基礎(chǔ)]Override 與 Overload的區(qū)別隘蝎。
答:
Override:
是指方法的重寫,C#中可重寫abstract睁宰、vritual 肪获、override三類方法,重寫是子類重寫父類的以上三種方法勋陪,是動(dòng)態(tài)綁定的贪磺,調(diào)用速度比方法隱藏慢,但靈活性好诅愚,重寫本質(zhì)是對(duì)方法表的修改
Overload:是指方法的重載,一個(gè)類中的多個(gè)同名方法,參數(shù)列表不同违孝,主要指參數(shù)個(gè)數(shù)或類型不同刹前,重載的目的是為了讓實(shí)現(xiàn)相似功能的方法用一個(gè)名稱表示,方便程序員編寫和理解代碼雌桑±恚可讀性好。
重寫和重載都是多態(tài)的一種體現(xiàn)校坑。
98.
[C#語(yǔ)言基礎(chǔ)]對(duì)比數(shù)組與集合拣技。
答:
數(shù)組:長(zhǎng)度固定,大小不變耍目,存儲(chǔ)空間連續(xù)膏斤,讀取速度快,插入邪驮,刪除速度慢莫辨。
集合:長(zhǎng)度不定,大小可變毅访,存儲(chǔ)空間可能不連續(xù)沮榜,適合存放不確定數(shù)量的數(shù)據(jù)。
99.
[C#語(yǔ)言基礎(chǔ)]假如有一個(gè)Person類喻粹,包含姓名蟆融,年齡字段,如對(duì)Person數(shù)組按年齡升序排列守呜,也可以按姓名升序排列振愿,將來(lái)可以會(huì)有更多的排序方式,你該怎么實(shí)現(xiàn)弛饭,說(shuō)出思路冕末。
答:
方法一:實(shí)現(xiàn)IComparer, 使用Array.Sort(Array, IComparer )
方法二:使用OrderBy或OrderByDescending 方法加Lambda表達(dá)式
如:arr =
arr.OrderBy(p=>p.age).ToArray();
Uinty筆試題
100.
[UI]NGUI
Button怎樣接受用戶點(diǎn)擊并調(diào)用函數(shù),具體方法名稱是什么?
答: 在按鈕上綁定一個(gè)帶有OnClick事件List;
EventDelegate();
EventDelegate(Callback call);//void Callback()
EventDelegate(MonoBehaviour target,string methodName)
101.
[Unity]Unity在PC端播放視頻注意的問(wèn)題是什么侣颂?
答:必須安裝QuickTime播放器档桃,不支持FLV視頻格式。
102.
[Unity]PC端播放視頻是與哪一個(gè)類有關(guān)憔晒?
答:MovieTexture藻肄。
103.
[Unity]通過(guò)Unity持久化存儲(chǔ)PlayerPrefs,如何實(shí)現(xiàn)存儲(chǔ)以及獲取一個(gè)整數(shù)數(shù)據(jù)拒担。
答:
存儲(chǔ):PlayerPrefs.SetInt
("MyKey", 1);
獲揉谕汀:int myKey = PlayerPrefs.GetInt
("MyKey");
104.
[Unity]通過(guò)Unity持久化存儲(chǔ)PlayerPrefs,如何刪除數(shù)據(jù)从撼。
答:
PlayerPrefs.DeleteKey ("MyKey");
PlayerPrefs.DeleteAll ();
105.
[Unity]一個(gè)角色要用到unity中尋路系統(tǒng)州弟,應(yīng)該添加哪個(gè)組件?
答:NavMeshAgent。
106.
[Unity]NavMeshObstacle組件的作用婆翔?
答:尋路網(wǎng)格動(dòng)態(tài)碰撞組件拯杠,用于運(yùn)動(dòng)的物體阻礙尋路物體效果。
107.
[Unity]射線中RaycastHit代表什么啃奴?
答:射線碰到的碰撞信息
108.
[Unity]通過(guò)什么可以區(qū)分射線碰到的游戲?qū)ο螅?/p>
答:通過(guò)LayerMask(層的遮罩)潭陪,RaycastHit返回的碰撞的標(biāo)簽。
109.
[動(dòng)畫系統(tǒng)]角色的AnimationType中(Generic最蕾,Legacy 依溯,Humanoid),哪個(gè)動(dòng)畫樣式可應(yīng)用在Mecanim動(dòng)畫系統(tǒng)瘟则。
答:Generic Humanoid類人樣式黎炉。
110.
[動(dòng)畫系統(tǒng)]Unity支持幾種動(dòng)畫?
關(guān)鍵幀動(dòng)畫
默認(rèn)骨骼動(dòng)畫(人型)
CAT