# * 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直接在類別或結構中宣告(是一個任意型別的變數)