---
# System prepended metadata

title: '* 2020-11-12 LINQ入門'

---

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