C#關(guān)鍵概念
C# 組織結(jié)構(gòu)的關(guān)鍵概念是程序 (program)棒旗、命名空間 (namespace)捆交、類(lèi)型 (type)兵多、成員 (member) 和程序集 (assembly)。
C# 程序由一個(gè)或多個(gè)源文件組成婉宰。
類(lèi)和接口就是類(lèi)型的示例势似。
字段 (field)拌夏、方法、屬性和事件是成員的示例履因。
程序集擴(kuò)展名.exe(應(yīng)用程序)或.dll(類(lèi)庫(kù))
CLR障簿、CTS、CLS
CLR:公共語(yǔ)言運(yùn)行時(shí)
CTS:通用類(lèi)型庫(kù)
CLS:公共語(yǔ)言規(guī)范
CLR與IL分別是什么含義栅迄?
CLR:公共語(yǔ)言運(yùn)行時(shí)站故,類(lèi)似于Java中的JVM,Java虛擬機(jī)霞篡;在.Net環(huán)境下世蔗,各種編程語(yǔ)言使用一種共同的基礎(chǔ)資源環(huán)境。CLR就是具體的編程語(yǔ)言如:C#.NET與操作系統(tǒng)之間的翻譯朗兵,同時(shí)為具體的編程語(yǔ)言提供資源:
IL污淋,中間語(yǔ)言,也稱(chēng)MSIL余掖,微軟中間語(yǔ)言寸爆,或CIL,通用中間語(yǔ)言;所有.NET源代碼(不管用哪種語(yǔ)言編寫(xiě))在進(jìn)行編譯時(shí)都被編譯成IL赁豆。在應(yīng)用程序運(yùn)行時(shí)被即時(shí)(Just-In-Time仅醇,JIT)編譯器處理成為機(jī)器碼,被解釋及執(zhí)行魔种。
什么是托管代碼和非托管代碼析二?
托管代碼就是Visual Basic .NET和C#編譯器編譯的代碼。編譯器把代碼編譯成中間語(yǔ)言(IL)节预,而不是能直接在你的電腦上運(yùn)行的機(jī)器碼叶摄。比如用C# /http://VB.NET寫(xiě)的任何代碼都是托管代碼
非托管代碼直接編譯成目標(biāo)計(jì)算機(jī)的機(jī)械碼,只能運(yùn)行在編譯出它們的計(jì)算機(jī)上安拟,或者是其它相同處理器或者幾乎一樣處理器的計(jì)算機(jī)上蛤吓。Visual C++可以創(chuàng)建非托管程序。比如COM組件, ActiveX組件和Win32接口函數(shù)都是非托管代碼糠赦。
托管代碼與非托管代碼的區(qū)別
1会傲、托管代碼獨(dú)立于平臺(tái)和語(yǔ)言,能更好的實(shí)現(xiàn)不同語(yǔ)言平臺(tái)之間的兼容拙泽;
???? 非托管代碼依賴(lài)于平臺(tái)和語(yǔ)言淌山。
2、托管代碼可享受CLR提供的服務(wù)(如安全檢測(cè)奔滑、垃圾回收等)艾岂,不需要自己完成這些操作顺少;
?????? 非托管代碼需要自己提供安全檢測(cè)朋其、垃圾回收等操作。
托管代碼的執(zhí)行過(guò)程
1脆炎、選擇編譯器:選擇一個(gè)或多個(gè)針對(duì)運(yùn)行庫(kù)的語(yǔ)言編譯器梅猿,如 Visual Basic、C#秒裕、Visual C++袱蚓、JScript 或許多第三方編譯器(如 Eiffel、Perl 或 COBOL 編譯器)几蜻。
2喇潘、編譯,將源代碼翻譯為microsoft中間語(yǔ)言(MSIL)并生成需要的元數(shù)據(jù)梭稚。
3颖低、執(zhí)行,實(shí)時(shí) (JIT) 編譯器將 MSIL 翻譯為本機(jī)代碼弧烤。PS:編譯過(guò)程中忱屑,代碼通過(guò)驗(yàn)證.
????? 確認(rèn) MSIL 和元數(shù)據(jù)是否可以將代碼確定為類(lèi)型安全。
4、運(yùn)行代碼:公共語(yǔ)言運(yùn)行庫(kù)提供使執(zhí)行能夠發(fā)生以及可在執(zhí)行期間使用的各種服務(wù)的結(jié)構(gòu)莺戒。
什么是基元類(lèi)型
由編譯器直接支持的數(shù)據(jù)類(lèi)型稱(chēng)為基元類(lèi)型伴嗡,例如:在C#中,int直接映射為System.Int32類(lèi)型
類(lèi)型:sbyte / byte / short / ushort /int / uint / long / ulong ? ? ? char / float / double / bool
類(lèi)型
類(lèi)型有兩種:值類(lèi)型 (value type) 和引用類(lèi)型 (reference type)
值類(lèi)型存儲(chǔ)是數(shù)據(jù)从铲,存儲(chǔ)于棧瘪校,派生于 System.ValueType
引用類(lèi)型的變量存儲(chǔ)對(duì)其數(shù)據(jù)的引用稱(chēng)為對(duì)象。存儲(chǔ)于堆名段。
值類(lèi)型渣淤、靜態(tài)變量被
GC回收嗎?
值類(lèi)型是在棧上吉嫩, 當(dāng)某方法返回時(shí)价认, 棧會(huì)恢復(fù)到該方法調(diào)用前的狀態(tài), 該方法在棧上分配的值類(lèi)型的內(nèi)存自然就釋放了自娩, 不必等GC用踩。PS:回收引用類(lèi)型
靜態(tài)字段 分配在Loader heap 中,非 GC heap,不受GC控制忙迁。
應(yīng)用程序域卸載的時(shí)候回收靜態(tài)變量
值類(lèi)型脐彩、引用類(lèi)型是否可以派生?
值類(lèi)型密封(seal)的姊扔,所以無(wú)法派生出新的值類(lèi)型惠奸。
引用類(lèi)型可以派生出新的類(lèi)型。
值類(lèi)型和引用類(lèi)型的區(qū)別
繼承System.Value的類(lèi)型都是值類(lèi)型恰梢,其他類(lèi)型都是引用類(lèi)型佛南。
引用類(lèi)型可以派生出新的類(lèi)型,而值類(lèi)型不能嵌言;
引用類(lèi)型存儲(chǔ)在堆中嗅回,而值類(lèi)型既可存儲(chǔ)在堆中也可以存儲(chǔ)在棧中。
引用類(lèi)型可以包含null值摧茴,值類(lèi)型不能(可空類(lèi)型功能允許將null賦給值類(lèi)型)绵载;
引用類(lèi)型變量的賦值只復(fù)制對(duì)對(duì)象的引用,而不復(fù)制對(duì)象本身苛白。而將一個(gè)值類(lèi)型變量賦給另一個(gè)值類(lèi)型變量時(shí)娃豹,將復(fù)制包含的值。當(dāng)比較兩個(gè)值類(lèi)型時(shí)购裙,進(jìn)行的是內(nèi)容比較懂版;而比較兩個(gè)引用類(lèi)型時(shí),進(jìn)行的是引用比較缓窜。
值類(lèi)型在內(nèi)存管理方面具有更好的效率定续,并且不支持多態(tài)谍咆,適合用作存儲(chǔ)數(shù)據(jù)的載體;引用類(lèi)型支持多態(tài)私股,適合用于定義應(yīng)用程序的行為摹察。
Int[]是引用類(lèi)型還是值類(lèi)型
數(shù)組類(lèi)型繼承System.Array,而System.Array繼承自System.Object倡鲸。所以所有的數(shù)組類(lèi)型都是引用類(lèi)型
引用類(lèi)型各概念
類(lèi):包含數(shù)據(jù)成員(字段)和函數(shù)成員(方法供嚎、屬性等)的數(shù)據(jù)結(jié)構(gòu)
接口:像一個(gè)協(xié)定,作為一個(gè)公共函數(shù)成員的命名集
委托:對(duì)具有特定參數(shù)列表和返回類(lèi)型的方法的引用峭状,通過(guò)委托克滴,將方法作為實(shí)體賦值給變量和作為參數(shù)傳遞
數(shù)組類(lèi)型:通過(guò)在某個(gè)類(lèi)型名后加一對(duì)方括號(hào)來(lái)構(gòu)造的,數(shù)組不用聲明就可以應(yīng)用。例如:int[];
用戶(hù)可以自定義類(lèi)型优床?
類(lèi)類(lèi)型(class type)劝赔、結(jié)構(gòu)類(lèi)型(struct type)、接口類(lèi)型(interface type)胆敞、枚舉類(lèi)型(enum
type)和委托類(lèi)型(delegate type)着帽。
哪些類(lèi)型支持泛型?
類(lèi)類(lèi)型移层、結(jié)構(gòu)類(lèi)型仍翰、接口類(lèi)型、委托類(lèi)型
變量
C# 中存在幾種變量(variable)观话,包括字段予借、數(shù)組元素、局部變量和參數(shù)频蛔,變量表示了存儲(chǔ)位置灵迫。
什么是裝箱和拆箱?
裝箱:從值類(lèi)型轉(zhuǎn)換到引用類(lèi)型帽驯。
拆箱:從引用類(lèi)型轉(zhuǎn)換到值類(lèi)型龟再。
裝箱
裝箱轉(zhuǎn)換允許將 value-type 隱式轉(zhuǎn)換為 reference-type。下列裝箱轉(zhuǎn)換:
從任何 value-type 到 object 類(lèi)型尼变。
從任何 value-type 到 System.ValueType 類(lèi)型。
從任何 non-nullable-value-type 到 value-type
實(shí)現(xiàn)的任何 interface-type浆劲。
從任何nullable-type到由nullable-type的基礎(chǔ)類(lèi)型實(shí)現(xiàn)的任何interface-type嫌术。
從任何enum-type到 System.Enum 類(lèi)型。
從任何具有基礎(chǔ) enum-type 的 nullable-type 到 System.Enum 類(lèi)型牌借。
裝箱轉(zhuǎn)換隱含著復(fù)制一份待裝箱的值
拆箱轉(zhuǎn)換
取消裝箱轉(zhuǎn)換允許將reference-type顯式轉(zhuǎn)換為value-type度气。存在以下拆箱轉(zhuǎn)換:
從 object 類(lèi)型到任何 value-type。
從 System.ValueType 類(lèi)型到任何 value-type膨报。
從任何interface-type到實(shí)現(xiàn)了該 interface-type 的任何non-nullable-value-type磷籍。
從任何interface-type到其基礎(chǔ)類(lèi)型實(shí)現(xiàn)了該interface-type的任何nullable-type适荣。
從 System.Enum 類(lèi)型到任何 enum-type。
從 System.Enum 類(lèi)型到任何具有基礎(chǔ) enum-type 的 nullable-type院领。