Net6新語法
1.1 頂級語句
- 直接在C#文件中直接編寫入口方法的代碼,不用類,不用Main。經典寫法仍然支持。反編譯一下了解真相。
- 同一個項目中只能有一個文件具有頂級語句。
- 頂級語句中可以直接使用await語法,也可以聲明函數
編譯器幫忙生成了命名空間、類名、方法名
1.2 全局Using指令
- 將 global 修飾符添加到 using 前,這個命名空間就應用到整個項目,不用重復using。
- 通常創建一個專門用來編寫全局using代碼的C#文件
- 如果csproj中啟用了
enable ,編譯器會自動隱式增加對於System、System.Linq等常用命名空間的引入,不同各類型項目引入的命名空間也不一樣。
1.3 Using聲明
在實現了Idisposable/IAsyncDisposable接口的類型的變量聲明前加上using當代碼執行離開變量的作用域時,對象就會被釋放。
{
using var outStream = File.OpenWrite("e:/1.txt");
using var writer = new StreamWriter(outStream);
}
writer.WriteLine("hello");
string s = File.ReadAllText("e:/1.txt");
Console.WriteLine(s);
1.4 文件范圍的命名空間聲明
可以省略namespace的大括號
1.5 可空引用類型
- C#數據類型分為值類型和引用類型兩種,值類型的變量不可以為空,而引用類型變量可以為空
- csproj中
enable 啟用可空引用類型檢查
- 如果字段可能為null,編譯器會警告
- 類型加 ? ,允許為null,警告消失
- 字段允許null,使用時會警告
- 消除警告的倆種方式
if非null判斷和字段名后加"!"
1.6 record類型基礎
(1)init 只能在構造函數內賦值
(2)在C#9.0中增加了記錄(record)類型的語法,編譯器會為我們自動生成Equals、GetHashcode等方法。
(3)record就是普通的一個類
(4)可以實現部分屬性是只讀的、而部分屬性是可以讀寫。
(5)默認生成的構造方法的行為不能修改,我們可以為類型提供多個構造方法,然后其他構造方法通過this調用默認的構造方法
(6)record也是普通類,變量的賦值是引用的傳遞。這是和結構體不同之處。
(6)with關鍵字生成對象的副本
既可以默認p1對象的所有屬性值,也可以在with里重新賦值