# * 2020-11-12 LINQ入門 * **擴充方法**也是一種語法糖,它使得靜態方法可以像執行個體方法一般的使用。*只有像而已* * 屬性的效能會比較好一點 * Count 屬性跟 Count() 方法是不一樣的,****請優先選擇屬性**** > There are four LINQ methods to retrieve a single item out of a sequence: * **Single()** returns the item, throws an exception if there are 0 or more than one item in the sequence. * **SingleOrDefault()** returns the item, or default value (null for string). Throws if more than one item in the sequence. * **First()** returns the first item. Throws if there are 0 items in the sequence. * **FirstOrDefault()** returns the first item, or the default value if there are no items) # 屬性是存取欄位的途徑 **比較運算子** * == * != * 靜態<--- # Stack堆疊 --Pop--> Heap記憶體 <--複製到--- Thread Stack 執行 Managed Heap *運算堆疊 int x; (欄位) int x{get; set;}屬性 參考:[討論實質與參考型別的記憶體配置](https://dotblogs.com.tw/h091237557/2014/05/26/145247) > C#裡的所有方法的參考都是參考型別(Reference type)所以都是在堆積上配置。將方法的參考當成參數傳遞就會造成記憶體配置,不管正在傳遞的方法是匿名方法還是預先定義的方法。 >Garbage Collection :在 common language runtime (CLR) 中,垃圾收集行程 (GC) 可作為自動記憶體管理員。 垃圾收集行程會管理應用程式記憶體的配置和釋放。 針對使用 managed 程式碼的開發人員,這表示您不需要撰寫程式碼來執行記憶體管理工作。 自動記憶體管理可以消除常見的問題,例如忘記釋放物件,並導致記憶體流失,或嘗試存取已釋放之物件的記憶體。 #String的不可變性immutable C#在string中是不可變的 字串池中的字串生命週期會隨著應用程式定義域(Application Domain),每個AD都有自己的Heap。 # 結構 Structure 通常可用來封裝一小組相關變數 宣告內部不能初始化執行個體(結構本身的建構式是被釘死的:可以寫有參數的建構式,但不能寫沒參數的建構式) //public struct Mystruct //{ // public int //} **要用new才能具現化** 參考:[欄位與屬性的區別](https://www.itread01.com/content/1548110544.html) # Nullable<T> **可為 null 的結構** *他是泛型,只能放實質型別 好處是可以正確表達資料庫的內容&形式 只是偽裝成null而已 Nullable<T> 不是T (nullable裡的int不是int) Ex public string? s; s還是string public int? x; x變成nullable int而不是int # Enum * 明確數值所代表的意義 * 縮限輸出輸入的範圍 ``` switch decimal Cal(decimal salary,DayOfWeek day) { switch(day) { case DayOfWeek.Satday: return salary*1.5m; case DayOfWeek.Sunday: return salary*2; default: return salary; } } ``` >列舉通常是互斥的,但可以把它當成疊加 用途:[FlagsAttribute]旗標式的列舉 做成位元ex:0,2,4,6,8(二進位) # 類別內部成員的存取修飾詞 * ## private 類別內成員**預設**宣告為private(同一個專案或是被繼承者都看的到) protected **internal**/private同一專案且被繼承才能用 *類別特性的修飾詞 * ## Abstract:找出一個群集共同的概念描述他(必須被複寫) **定義:抽象成員必須被子類別覆寫** 不具有公開建構式(因為預設為protected) 可以擁有實做不完整的抽象成員 abstract要馬public要馬protected 裡面的成員必須被實作完整(完整的方法是有大括號的body) 方法必須被宣告為抽象類別的method * ## Sealed: 一個型別如果被宣告為**Sealed**,所以絕對不可能被當成父類別被繼承使用(結構都是密封的) *絕子絕孫* * ## Virtual:(可以被覆寫) 成員以 virtual 宣告表示為虛擬成員,而繼承此成員所在類別的 子類別可以覆寫 (override) 此成員 *不要沒事亂搞遮蔽!!! >Java程式裡天生是virtual,C#天生是sealed,所以天生無法被覆寫 虛擬方法才是依照執行個體方法呼叫 >建構式是不會被繼承的! https://noob.tw/operating-system-multitasking/ https://medium.com/@josephine307/c-%E5%9F%BA%E7%A4%8E%E5%AD%B8%E7%BF%92-2-%E5%9F%BA%E6%9C%AC%E8%B3%87%E6%96%99%E5%9E%8B%E5%88%A5-type-%E4%BD%BF%E7%94%A8%E8%80%85%E5%AE%9A%E7%BE%A9%E5%9E%8B%E5%88%A5-7ca87010a345 # Const 常數 通常const命名皆用大寫 * 在編譯時已經決定常數的數值(宣告時期同時完成初始化) * 具不可修改之特性 * 盡量用read only不要用const宣告的方式 static的生命週期是跟著型別(模具) 執行個體成員是跟著執行個體(雞蛋糕&內餡) field直接在類別或結構中宣告(是一個任意型別的變數)