C# 8.0 以后
官網
C# 7.3
》》in
C# 7.2
》》 命名參數、具名參數
》》》 條件 ref 表達式
C# 7.1
》》 default 運算符
default 在C#7.1中得到了改進,不再需要default(T)了
//變量賦值C#7.0
var s = "字符串";
s = default(string); C#7.1
var s = "字符串";
s = default;//初始化賦值
C#7.0
var dstring = default(string);
var dint = default(int);
var dintNull = default(int?);
var d = default(dynamic);
var dt = default(DateTime);
var dt1 = default(DateTime?);C#7.1
string s = default;
int i = default;
DateTime? dt = default;
dynamic d = default;//可選參數
C#7.0
void Test(int a, string b = default(string))
{
}C#7.1
void Test(int a, string b = default)
{
}
》》》 元組功能提供了簡潔的語法來將多個數據元素分組成一個輕型數據結構。
(double, int) t1 = (4.5, 3);
Console.WriteLine($"Tuple with elements {t1.Item1} and {t1.Item2}.");
// Output:
// Tuple with elements 4.5 and 3.(double Sum, int Count) t2 = (4.5, 3);
Console.WriteLine($"Sum of {t2.Count} elements is {t2.Sum}.");
// Output:
// Sum of 3 elements is 4.5.
C# 7.0
》》類型模式
》》格式:expr is type varname, varname 是類型匹配后,賦值的變量名稱。
》》常量模式
描述:用于測試表達式計算結果是否為指定的常數值。
格式:expr is constant,
constant 的可以是下面的表達式:
- 文字值。
- 一個枚舉常量。
- 已聲明 const 變量的名稱。
》》var 模式 跟 》》類型模式 一樣
描述:始終匹配成功,可將表達式的值綁定到新局部變量。
格式:expr is var varname
如果 expr 為 null ,is 表達式也為 true, varname 為 null。
static IEnumerable<int> Factor(int number){int max = (int)Math.Sqrt(number);for (int i = 1; i <= max; i++){if (number % i == 0){yield return i;if (i != number / i){yield return number / i;}}}}int[] testSet = { 22, 33, 44, 55};var primes = testSet.Where(n => Factor(n).ToList() is var factors&& factors.Count == 2&& factors.Contains(1)&& factors.Contains(n));
》》》Out 關鍵字
可以在out后面直接聲明變量,例如前TryParse需要先定義再使用的兩行的代碼,現在一行即可: int.TryParse(s, out int num),從而簡化語法。
》》 Tuples 元組
元組改進,可以為無組添加名稱,用法:
方式1:定義:(int one, int two) tuple = (1, 2); 使用: WriteLine( " f i r s t : t u p l e . o n e , s e c o n d : t u p l e . t w o " ) ; 。方式 2 :定義: v a r t u p l e 2 = ( o n e : 1 , t w o : 2 ) ; 使用: W r i t e L i n e ( "first:{tuple.one}, second:{tuple.two}");。 方式2:定義:var tuple2 = (one: 1, two: 2); 使用: WriteLine( "first:tuple.one,second:tuple.two");。方式2:定義:vartuple2=(one:1,two:2);使用:WriteLine(“first:{tuple2.one}, second:{tuple2.two}”);。
》》》本地方法
》》 Ref
對ref引用進行了加強,現在可以引用一個方法中的局部變量,
語法是:在方法定義前加上 ref,同時在返回時也加上ref,
如定義函數
ref int GetDataRef(int[] data, int index)
{
return ref data[index];
} ref int num = ref GetDataRef(new data[]{1,2,3}, 0);
則 ref int num = ref GetDataRef(new data[]{1,2,3}, 0); 返回,對數組中第0個元素的引用。
》》 throw ,之前都說手動拋出異常,C# 7.0 引入了throw表達式,
它允許我們在條件表達式中拋出異常。官方的解析說這對提高代碼可讀性有利。如:
》》》 數字文本語法改進 這個一般上位機用比較多
C# 6.0
》》Import of static type members into namespace
用于簡化書寫。在引用類名后,可以直接使用類的靜態成員,
比如在使用 using static System.String; 后,
可以將 String.IsNullOrEmpty(str) 可以直接寫成 IsNullOrEmpty(str)。
》》只讀自動屬性
只讀自動屬性提供了更簡潔的語法來創建不可變類型。 你聲明僅具有 get 訪問器的自動屬性:
public string FirstName { get; }
public string LastName { get; }
FirstName 和 LastName 屬性只能在構造函數的主體中設置;
》》 自動屬性初始化表達式
自動屬性初始值設定項可讓你在屬性聲明中聲明自動屬性的初始值。
public class Student
{
public string FirstName { get; } = “xxx”;
public string LastName { get; private set; } = “tttt”;
}
FirstName,LaseName 成員在聲明它的位置處被初始化。 這樣,就能更容易地僅執行一次初始化。 初始化是屬性聲明的一部分,可更輕松地將存儲分配。
》》 Expression-bodied(正文表達式) 函數成員
你編寫的許多成員是可以作為單個表達式的單個語句。 改為編寫 expression-bodied 成員。這適用于方法和只讀屬性。
在 C# 7.0 中,你可以在屬性 和索引器 上實現構造函數 、終結器 以及 get 和 set 訪問器
例如,重寫 ToString() 通常是理想之選:
public override string ToString() => $“{LastName}, {FirstName}”;
也可以將此語法用于只讀屬性:
public string FullName => $“{FirstName} {LastName}”;
》》Null 條件運算符 斷路運算符 ?
Null 條件運算符使 null 檢查更輕松、更流暢。 將成員訪問 . 替換為 ?.:
var first = person?.FirstName;
在前面的示例中,如果 Person 對象是 null,則將變量 first 賦值為 null。 否則,將 FirstName 屬性的值分配給該變量。
最重要的是?. 意味著當 person 變量為 null 時,此行代碼不會生成 NullReferenceException。
它會短路并返回 null。 還可以將 null 條件運算符用于數組或索引器訪問。
將索引表達式中的 [] 替換為 ?[]。
first = person?.FirstName ?? “Unspecified”; //?? a??b 當a為null時則返回b,a不為null時則返回a本身。
》》字符串內插
使用 C# 6,新的字符串內插功能可以在字符串中嵌入表達式。
使用 $ 作為字符串的開頭,并使用 { 和 } 之間的表達式代替序號:
public string FullName => $“{FirstName} {LastName}”;
》》異常篩選器
try{doSomething();
} catch(Exception e) when (e.Message.Contains("xx")){ProcessException(e);
}
//等價于
catch (Exception e){if(e.Message.Contains("xx")) // 如果判斷的邏輯較多,建議使用該方式。{return "Site Moved";}}
》》 nameof
Nameof是一個運算符,用于獲取代碼元素(如變量、類和方法等)的名稱(是的,字符串)。
它通過將名稱作為字符串文字返回來幫助您密切關注名稱!
int myInt = 10;
Console.WriteLine(nameof(myInt)); // Output: “myInt”
》》索引器初始化關聯集合, C# 3.0 集合初始化器