抽象很重要,是在找出關鍵性特徵(與需求有關)
為什麼要依賴抽象?
如果依賴具體時,面對需求變更會導致要改的東西很多而且程式碼愈改愈複雜
所以如果依賴抽象,就可以準時下班(重點)
人的思考方式其實就是一種抽象的概念
例如平常看到柯基、博美…等,我們都會知道這些生物叫做狗
繼承 - C#只能繼承「一個」上層類別, 但可以繼承多個介面
封裝 - 隱藏不必要被外界所知的資訊、隱藏行為的變化
多型 - 繼承式、參數式(泛型)、多載(overloading-程序、運算子)、強制同型(與編譯有關)
int與System.Int32有什麼不同?
編譯後的結果一樣。
int定義在C#
System.Int32定義在.Net Framework
Primitive Type
Reference Type - Interface、Class、Delegate
Value Type - Structure、Enum
變數內容就是物件本身
存在於 Stack
變數內容則是儲存指向物件的參考(指標)
存在 Heap
範例程式碼
int a = 10;
int b = a;
1.產生變數a的記憶體位址與值。
2.複製變數a的值。
3.產生變數b的記憶體位置,並將步驟2複製出來的值放到變數b的值。
4.刪除步驟2複製出來的值。
強型別
隱含型別(語法糖)
右(後)決議型別
只能做為宣告區域變數使用
幫助記憶 - 使用具有代表意義的文字取代常數
限制 - 限制輸入的範圍
列舉值應為bit
[Flags]
public enum Authority
{
Read = 1,
Write = 2,
Create = 4,
Delete = 8
}
自訂的複合(Compositing)實值型別
開發遊戲(想避免GC影響的時候才比較需要使用)
Nullable
實值型別與參考型別之間的轉換
造成效能耗損
在命名空間中宣告的類別可為 public 或 internal(預設),而且只有型別可以宣告
類別內的成員可以宣告為
private(預設)
internal - 同一個組件看的到
protected - 繼承者看的到
protected internal - 同一個組件或繼承者看的到
public
abstract(抽象)
sealed(密封, 不可被繼承)
Static fields儲存於「參考型別物件」內
Method在記憶體內都是獨立唯一, 也儲存於「參考型別物件」內
所以Static Method與一般的Method差別只在呼叫的方式不同
const宣告, 同時必須初始化
不可修改
常數如果有修改, 如果有參考到該dll者都需要重新編譯
在.Net, 類別層級的變數
一般情境下, 欄位的存取層級很少是public(readonly例外)
方法的變形
使用屬性取代欄位成為公開介面, 保護欄位
實值型別傳值
實值型別傳址
參考型別傳值
參考型別傳址
Out宣告(例如:xxx.TryParse)
params宣告(例如:String.Format)
參考資料
利用Visual studio觀察記憶體內容