類型語法基礎和內存管理基礎
一:基礎類型和語法
1.1 .net中所有類型的基類是什麽:
在.net中所有的內建類型都繼承System.Object類型。C#中編譯器自動添加繼承申明
public class A{}
public class A:System.Object{}
1.2 值類型和引用類型的區別
.net中分值類型和引用類型,都繼承自System.Object,區分標準是否繼承System.ValueType(繼承自System.Object),
繼承自System.VauleType的類型的是值類型(整型,浮點,布爾,結構,枚舉),其他的都是引用類型(class)。
PS:嚴格來說,System.Object作為所有內建類型的基類,本身沒有值類型和引用類型之分。new的System.Object對象有引用類型的特點。
這就是值類型在某些場合需要拆箱裝箱的原因。
(1):賦值時的區別
值類型:直接獲得數據副本
引用類型:把對象的引用賦值給變量(多個變量可以引用到一個對象實例上)
(2):內存分配的區別
值類型:對象會在堆棧上分配內存(空間有限,運行效率高)
引用類型:對象會在堆上分配內存
(3):繼承結構區別
值類型的比較方法:Equals
1.3 裝箱和拆箱的原理
(1)裝箱:CLR把堆棧上的值類型移動到堆上
(2)拆箱:堆中的對象復制到堆棧中,並返回其值
PS:這種操作性能代價很大的,尤其是堆棧上空間上的消耗,並且會觸發垃圾回收,大規模形象系統的性能。
避免拆裝箱:
(1)值類型的格式化輸出
int i = 10;
Console.WriteLine(i.ToString());
(2)System.Object類型的容器,使用泛型技術
ArrayList arrList = new ArrayList();
arrList.Add(0);
arrList.Add("1");
改為:
List<int> intList = new List<int>();
intList.Add(0);
intList.Add(1);
1.4 struct和class的區別,struct適用於那些場合
首先,struce是值類型分配在堆棧上,而class是引用類型分配在堆上。
然後,struct不具有繼承特性,雖然可以重新定義在System.Object的虛方法,但是不能定義新的虛方法和抽象方法。
最好,struct不能有無參數的構造方法(class默認就有),也不能為成員變量定義初始化。
public struce A
{
public int a = 1; //編譯不通過
}
1.5 C#中方法的參數傳遞方式
(1)ref關鍵字:引用傳遞參數,需要在傳遞前初始化
(2)out關鍵字:引用傳遞參數,需要在傳遞前初始化
(3)params關鍵字:允許方法在定義時不確定參數的數量,當一個方法神明了params參數後,就不允許後面有任何其他參數
1.6 淺復制和深復制區別
(1)淺復制:復制一個對象的時候,僅僅復制原始對象中所有的非靜態類型成員和所有的引用類型成員的引用。
(2)深復制:復制一個對象的時候,不僅復制所有的非類型成員,還要復制所有引用類型成員的實際對象。
二:內存管理和垃圾回收
2.1.net中棧和堆的差異
(1).net中的堆棧
用來存儲值類型的對象和引用類型對象的引用,其釋放按照FILO邏輯
TempClass a = new TempClass(); //TempClass是引用類型,有兩個整型的int成員。
a.numA = 1; //當a的作用域結束之後,三個按照a.numB -> a.numA ->a的順序退棧
a.numB = 2;
(2).net中的拓展堆
(3).net中的非拓展堆
2.2 string abc = "aaa"+"bbb"+"ccc";共分配了多少內存
2.3簡要說說,net中的GC運行機制
(1)找到所有不再被使用的對象,標記為垃圾,騰出空間內存
(2)移動仍在使用的對象
2.4 Dispose和Finalize
(1)Dispose方法,依賴類型的使用者
[ComVisible(true)]
public interface IDispoable
{
void Dispose();
}
(2)Finalize()
類型語法基礎和內存管理基礎