標籤:
1.byte,int等等,這些簡單類型實際上是BCL基底類別庫類型的別名。
2.所有實值型別都隱式地繼承自System.ValueType類型(System.ValueType本身是一個類類型)。之所以說是“隱式地”,是因為在C#代碼中,是看不見這個繼承關係的,這個關係只有通過MSIL代碼才可以看到,System.ValueType類型和所有的參考型別都繼承自System.Object基類,
備忘: 在C#多態中,不支援多重繼承的,
| 類型 |
繼承 |
再繼承 |
| int,struct,enum… |
System.ValueType |
System.Object |
| 參考型別 |
可以繼承其他類 |
System.Object |
| |
|
|
由於不存在多重繼承,那麼實值型別(結構等等)本身就繼承了System.ssValueType,就不能繼承其他類。
3.實值型別與參考型別在 線程堆棧(棧是一種後進先出的資料結構)以及堆(堆是用於為參考型別的執行個體(對象)分配空間的記憶體地區,在堆上建立一個對象,會將對象地址傳給棧上的變數,反過來叫變數指向對象,或者變數引用此對象) 的存放
實值型別(變數本身包含了實值型別的全部欄位),會分配線上程堆棧上;注意一個細節:只有對變數進行操作,才會進行入棧;
4. .NET的一個約束:所有的元素使用前都必須初始化。
//Demo1int i;Console.WriteLine(i);
//Demo2public class Person{ int ID{get;set;} string Name{get;set;} List<Book> Books {get;set;} //定義某個集合作為屬性}
Demo1:error 使用未賦值的變數
Demo2: 在多次使用Person類中,vs會經常提示警告:會出現“NullReferenceException異常”,當然這個異常也分使用情境,但非常希望,你能在Person類的建構函式中,執行個體化Books,this.Books = new List<Book>();這是個好習慣。
5.結構類型 struct
//定義public struct ValPoint{ public int x; public void Blank()}//調用ValPoint vPoint1;vPoint1.Blank();Console.WriteLine(vPoint);
在調用中報錯,“使用了未賦值的局部變數”,int x,沒賦值。
假設:
//定義 3 個局部變數public struct ValPoint{ public int x; public int y; public int z; public void Blank()}
那麼,我們必須初始化 x,y,z 。還是那個原則:.NET的所有元素,都必須先初始化。
解決這個問題可以通過這樣一種方式:編譯器隱式地位結構類型建立無參數的建構函式。這個建構函式中會對結構成員進行初始化;所有實值型別成員被賦予0或者相當於0的值,所有參考型別被賦予null值;
//調用ValPoint vPoint1 = new ValPoint()
new的作用? 執行個體化?分配記憶體? 不是,注意:結構struct 變數本身就代表一個執行個體。 這裡僅僅調用當前結構的預設建構函式,初始化結構變數中的所有欄位。
//直接調用Console.WriteLine((new ValPoint).x);
.x 前面是個對象,這裡會建立一個臨時變數,沒有名稱,然後再使用結構的預設建構函式對臨時變數進行初始化。
C#基礎(1)