一、型別成員
類成員定義有(public、private、internal、protected)。
Public--對任何類和成員都是公開的,無限制
Private--是私有的,僅能由類內部程式碼訪問,如果沒有宣告,預設使用此關鍵字
Internal--僅能在所屬名稱空間內部訪問
Protected--可以由類或者其派生類中的程式碼訪問
類成員--欄位、方法、屬性
public class MyClass { public int MyInt = 2019;//欄位 public static string MyMain() { return "這是方法"; } public int MyProperty { get; set; }//屬性 }
欄位--一個只讀、可讀/寫的資料值
方法--對型別或物件狀態資料操作的一個過程實現
屬性--它可以像方法一樣操作類或物件的狀態資料,但看上去卻像欄位一樣的書寫方式
二、型別操作(隱式轉換、顯示轉換、裝箱、拆箱)
隱式轉換--對於內建數值型別,如果要儲存的值無需截斷或四捨五入即可適應變數,則可以進行隱式轉換、小精度資料轉大精度也可進行隱式轉換
Int Num=100; Long Bignum= Num;
顯示轉換--顯示轉換也稱為強制轉換,強制轉換是顯式告知編譯器你打算進行轉換且你知道可能會發生資料丟失的一種方式。
Double Num=100.1; Int a; a=int.Parse(Num);
顯示轉換存在一定的風險性,如若出現失誤可能會丟擲異常或者影響整個結果的精確性。假如在不知a的型別的情況下進行顯示轉換,但是轉換失敗則會引起程式丟擲異常。
var a = "yi"; int b = int.Parse(a);
這是可以嘗試使用TryParse,這裡返回的是一個bool,轉換成功則True
var a = "yi"; int b; int.TryParse(a, out b);
型別操作轉換--裝箱、拆箱
public void Test() { //裝箱 int a = 1; object obj = a; //拆箱 object obj2 = 2; int b = (int)obj2; }
首先我們得了解,值型別是分配線上程棧中的,不受垃圾回收機制管理。而引用型別分配在託管堆中的。
裝箱--簡單來說值型別轉換引用型別是裝箱,詳細來說是。先在託管記憶體中分配記憶體,然後將值型別的值複製到記憶體堆中,然後返回新物件的地址,這一過程為裝箱。
拆箱--拆箱並不是裝箱的逆過程,簡單說也是引用型別轉換為值型別為拆箱,詳細來說拆箱是獲取為裝箱部分的指標,然後將未裝箱部分的值複製到堆疊中。
三、型別轉換(Is,As)
型別轉換操作符--is、as
as--是將一個物件從一種型別轉換為另一種型別,如果轉換成功則返回該型別,否則返回null
A a=new A(); B b= A as B;//轉換正常則返回B型別,轉換失敗則返回null
is--是判斷一種型別轉換為另一種型別,如果轉換成功則返回True,否則返回False。
A a=new A(); If(B is A)//返回True False { }
保險起見可以先用is對型別轉換進行判斷然後再使用as進行型別轉換。當然這樣的話可能會造成更新的效能消耗。
更簡單的一次驗證並安全的操作:
A a=new A(); B b= A as B; if(B!=null){} else{}
四、型別分類
一切皆物件,每一個物件都對應一個類,所有的類都有一個基類--Object-System.Object
然後其下又可分為值型別(基本資料型別)、引用型別。
值型別:整型、浮點型、字元型、布林型、結構體、列舉
引用型別:陣列、字串、類、介面、委託
關於型別的詳解將在下一節中詳細講出。
五、擴充套件延伸(抽象類、類)
在這裡我們詳細講解下類以及抽象類。同時與介面直接的區別和相同。
類-抽象類:
1、都可被繼承
2、抽象類不能被例項化,只是用來繼承的,普通類可以例項化
3、抽象類只含有方法宣告,沒有方法體。並且只能存在於抽象類中
4、繼承抽象類的子類必須實現抽象方法,除非子類也是抽象類
5、抽象類中可以包含抽象方法和例項方法
介面-抽象類:
相同
1、都可被繼承
2、都可以有宣告不實現的方法
3、都不可被例項化
4、子類必須實現其宣告的方法
不同:
1、抽象類可多繼承,介面單繼承
2、抽象類可包含例項方法,介面不可包含
3、介面支援回撥,抽象類不支援
既然有類、抽象類、介面,那麼他們分別在什麼時候使用呢?
類不用說了吧,普通情況下使用即可。
抽象類--如果需要設計大的功能單元,則使用抽象類。抽象類主要用於關係密切的物件。
介面--如果設計小而簡練的功能塊的話可以使用介面,介面適合為不想關的類提供通用功能