C#關鍵概念
C# 組織結構的關鍵概念是程序 (program)、命名空間 (namespace)、類型 (type)、成員 (member) 和程序集 (assembly)。
C# 程序由一個或多個源文件組成。
類和接口就是類型的示例。
字段 (field)、方法、屬性和事件是成員的示例。
程序集擴展名.exe(應用程序)或.dll(類庫)
CLR、CTS、CLS
CLR:公共語言運行時
CTS:通用類型庫
CLS:公共語言規范
CLR與IL分別是什么含義?
CLR:公共語言運行時,類似于Java中的JVM,Java虛擬機;在.Net環境下,各種編程語言使用一種共同的基礎資源環境。CLR就是具體的編程語言如:C#.NET與操作系統之間的翻譯,同時為具體的編程語言提供資源:
IL,中間語言,也稱MSIL,微軟中間語言,或CIL,通用中間語言;所有.NET源代碼(不管用哪種語言編寫)在進行編譯時都被編譯成IL。在應用程序運行時被即時(Just-In-Time,JIT)編譯器處理成為機器碼,被解釋及執行。
什么是托管代碼和非托管代碼?
托管代碼就是Visual Basic .NET和C#編譯器編譯的代碼。編譯器把代碼編譯成中間語言(IL),而不是能直接在你的電腦上運行的機器碼。比如用C# /http://VB.NET寫的任何代碼都是托管代碼
非托管代碼直接編譯成目標計算機的機械碼,只能運行在編譯出它們的計算機上,或者是其它相同處理器或者幾乎一樣處理器的計算機上。Visual C++可以創建非托管程序。比如COM組件, ActiveX組件和Win32接口函數都是非托管代碼。
托管代碼與非托管代碼的區別
1、托管代碼獨立于平臺和語言,能更好的實現不同語言平臺之間的兼容;
???? 非托管代碼依賴于平臺和語言。
2、托管代碼可享受CLR提供的服務(如安全檢測、垃圾回收等),不需要自己完成這些操作;
?????? 非托管代碼需要自己提供安全檢測、垃圾回收等操作。
托管代碼的執行過程
1、選擇編譯器:選擇一個或多個針對運行庫的語言編譯器,如 Visual Basic、C#、Visual C++、JScript 或許多第三方編譯器(如 Eiffel、Perl 或 COBOL 編譯器)。
2、編譯,將源代碼翻譯為microsoft中間語言(MSIL)并生成需要的元數據。
3、執行,實時 (JIT) 編譯器將 MSIL 翻譯為本機代碼。PS:編譯過程中,代碼通過驗證.
????? 確認 MSIL 和元數據是否可以將代碼確定為類型安全。
4、運行代碼:公共語言運行庫提供使執行能夠發生以及可在執行期間使用的各種服務的結構。
什么是基元類型
由編譯器直接支持的數據類型稱為基元類型,例如:在C#中,int直接映射為System.Int32類型
類型:sbyte / byte / short / ushort /int / uint / long / ulong ? ? ? char / float / double / bool
類型
類型有兩種:值類型 (value type) 和引用類型 (reference type)
值類型存儲是數據,存儲于棧,派生于 System.ValueType
引用類型的變量存儲對其數據的引用稱為對象。存儲于堆。
值類型、靜態變量被
GC回收嗎?
值類型是在棧上, 當某方法返回時, 棧會恢復到該方法調用前的狀態, 該方法在棧上分配的值類型的內存自然就釋放了, 不必等GC。PS:回收引用類型
靜態字段 分配在Loader heap 中,非 GC heap,不受GC控制。
應用程序域卸載的時候回收靜態變量
值類型、引用類型是否可以派生?
值類型密封(seal)的,所以無法派生出新的值類型。
引用類型可以派生出新的類型。
值類型和引用類型的區別
繼承System.Value的類型都是值類型,其他類型都是引用類型。
引用類型可以派生出新的類型,而值類型不能;
引用類型存儲在堆中,而值類型既可存儲在堆中也可以存儲在棧中。
引用類型可以包含null值,值類型不能(可空類型功能允許將null賦給值類型);
引用類型變量的賦值只復制對對象的引用,而不復制對象本身。而將一個值類型變量賦給另一個值類型變量時,將復制包含的值。當比較兩個值類型時,進行的是內容比較;而比較兩個引用類型時,進行的是引用比較。
值類型在內存管理方面具有更好的效率,并且不支持多態,適合用作存儲數據的載體;引用類型支持多態,適合用于定義應用程序的行為。
Int[]是引用類型還是值類型
數組類型繼承System.Array,而System.Array繼承自System.Object。所以所有的數組類型都是引用類型
引用類型各概念
類:包含數據成員(字段)和函數成員(方法、屬性等)的數據結構
接口:像一個協定,作為一個公共函數成員的命名集
委托:對具有特定參數列表和返回類型的方法的引用,通過委托,將方法作為實體賦值給變量和作為參數傳遞
數組類型:通過在某個類型名后加一對方括號來構造的,數組不用聲明就可以應用。例如:int[];
用戶可以自定義類型?
類類型(class type)、結構類型(struct type)、接口類型(interface type)、枚舉類型(enum
type)和委托類型(delegate type)。
哪些類型支持泛型?
類類型、結構類型、接口類型、委托類型
變量
C# 中存在幾種變量(variable),包括字段、數組元素、局部變量和參數,變量表示了存儲位置。
什么是裝箱和拆箱?
裝箱:從值類型轉換到引用類型。
拆箱:從引用類型轉換到值類型。
裝箱
裝箱轉換允許將 value-type 隱式轉換為 reference-type。下列裝箱轉換:
從任何 value-type 到 object 類型。
從任何 value-type 到 System.ValueType 類型。
從任何 non-nullable-value-type 到 value-type
實現的任何 interface-type。
從任何nullable-type到由nullable-type的基礎類型實現的任何interface-type。
從任何enum-type到 System.Enum 類型。
從任何具有基礎 enum-type 的 nullable-type 到 System.Enum 類型。
裝箱轉換隱含著復制一份待裝箱的值
拆箱轉換
取消裝箱轉換允許將reference-type顯式轉換為value-type。存在以下拆箱轉換:
從 object 類型到任何 value-type。
從 System.ValueType 類型到任何 value-type。
從任何interface-type到實現了該 interface-type 的任何non-nullable-value-type。
從任何interface-type到其基礎類型實現了該interface-type的任何nullable-type。
從 System.Enum 類型到任何 enum-type。
從 System.Enum 類型到任何具有基礎 enum-type 的 nullable-type。