本文包含如下便捷語法:express
在聲明它的位置處被初始化。 這樣,就能更容易地僅執行一次初始化。 以下:安全
public string FeatureOne { get; } = "NewFeature_One";
public ICollection<double> Grades { get; } = new List<double>();
public string AutoInit { get; set; } = "Auto Init";
複製代碼
當咱們編寫的函數主體只包含一條能夠表示爲表達式的語句時,可經過改成編寫 expression-bodied 成員來簡化該語法。 好比:微信
public override string ToString() => $"{LastName}, {FirstName}";
複製代碼
還能夠在只讀屬性中使用 expression-bodied 成員:(如下語句將會被編譯成只讀屬性)async
public string FullName => $"{FirstName} {LastName}";
// Expression-bodied get / set accessors.
public string Label {
get => label;
set => this.label = value ?? "Default label";
}
複製代碼
using static
加強功能可用於導入單個類的靜態方法。 之前,using
語句將全部類型導入命名空間中。 好比,咱們只須要使用System
命名空間下的Math
類,其餘的類咱們並不使用,此時咱們能夠經過如下方式引入Math類ide
using static System.Math;
複製代碼
經過這種方式引入後,使用方式也與以前有必定的變化,以下:函數
// 以前的使用方式
Math.Abs(1 + 2.5);
// 使用 using static System.Math;以後的方式
Abs(1 + 2.5);
複製代碼
切記,這種引入方式只會引入該聲明類中的靜態方法。引入後的靜態方法可當成全局函數使用,但其做用範圍須要分爲文件頂部引入和命名空間內部引入(參見溫故之C# using注意事項)工具
?. ??
?.
運算符在代碼中,爲了保證每一個引用不會拋出NullException
異常,咱們每每須要進行以下判斷:this
Feature feature = GetFeature();
if(tmpValue != null) {
Console.WriteLine(feature.ToString());
}
複製代碼
而有了 Null 條件運算符以後,咱們的寫法可簡化爲以下feature?.ToString()
:編碼
Feature feature = GetFeature();
Console.WriteLine(feature?.ToString());
複製代碼
相信,此運算符在事件判斷上更是會普遍使用,好比有Saved
事件,如今,咱們能夠以更加簡潔且更加線程安全的方式訪問了,以下spa
Saved?.Invoke(this, eventArgs);
複製代碼
??
運算符此運算符可保證在沒有合法值之時,爲變量提供一個默認值。 在以前,是這樣的:
string obj = null;
string res = string.Empty;
if (obj == null) {
obj = "this is default value";
}else {
res = obj;
}
Console.WriteLine(res);
複製代碼
而如今,是這樣的:
string obj = null;
string res = obj ?? "this is default value";
Console.WriteLine(res);
複製代碼
看,如今是否是簡潔了不少呢?另外,若是須要拋出異常,則能夠按如下方式:
string obj = null;
string res = obj ?? throw new ArgumentNullException(paramName: nameof(obj), message: "must not be null");
Console.WriteLine(res);
複製代碼
在以前,咱們格式化字符串方式以下:
string tmp = string.Format("{0} {1}", FirstName, LastName);
複製代碼
如今,咱們能夠以更加方便的方式處理:
string tmp = $"{FirstName} {LastName}";
複製代碼
不知道您是否發現了它的優點?除了比以前更加簡潔以外,更重要的是,當須要格式化的參數不少(好比5個以上時),很容易將這些參數的順序混淆,而如今,您所寫的,就是它存在的順序,減小了出錯的機率(甚至根本不會出錯)。
異常篩選器是肯定什麼時候應該應用給定的 catch
子句的子句。若是用於異常篩選器的表達式計算結果爲 true
,則 catch
子句將對異常執行正常處理。 若是表達式計算結果爲 false
,則將跳過 catch
子句。使用方式以下:
public static async Task<string> MakeRequest() {
var client = new System.Net.Http.HttpClient();
var streamTask = client.GetStringAsync("https://localHost:10000");
try {
var responseText = await streamTask;
return responseText;
} catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("301"))
{
return "Site Moved";
}
}
複製代碼
nameof
表達式的計算結果爲符號的名稱。 每當須要變量、屬性或成員字段的名稱時,這是讓工具正常運行的好辦法。 nameof
的其中一個最多見的用途是提供引發異常的符號的名稱,以下:
if (IsNullOrWhiteSpace(lastName))
throw new ArgumentException(message: "Cannot be blank", paramName: nameof(lastName));
複製代碼
這樣寫有個好處就是,假如咱們須要使用重構工具重命名符號, 更改lastName
爲firstName
,則會在 nameof
表達式中對其重命名。而字符串硬編碼的方式則沒有這一優點,很容易被忽略。
若是您寫過WPF程序,那麼您確定使用過INotifyPropertyChanged
, 以前要實現屬性更改的通知功能,實現方式以下:
public string LastName {
get { return lastName; }
set {
if (value != lastName) {
lastName = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("LastName"));
}
}
}
private string lastName;
複製代碼
而如今,PropertyChangedEventArgs
的參數,可以使用nameof(LastName)
:
public string LastName {
get { return lastName; }
set {
if (value != lastName) {
lastName = value;
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs(nameof(LastName)));
}
}
}
private string lastName;
複製代碼
在 catch
表達式中使用 await
,這一般用於日誌記錄方案。以下:
public static async Task<string> MakeRequestAndLogFailures() {
await logMethodEntrance();
var client = new System.Net.Http.HttpClient();
var streamTask = client.GetStringAsync("https://localHost:10000");
try {
var responseText = await streamTask;
return responseText;
} catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("301")) {
await logError("Recovered from redirect", e);
return "Site Moved";
} finally {
await logMethodExit();
client.Dispose();
}
}
複製代碼
不過,我的還沒有發現此記錄方式的優點,暫不推薦使用。通常地,在項目中須要記錄日誌,會採用單獨的服務來處理日誌,即有異常時,當即將異常信息發送給日誌記錄服務,而程序自己繼續下一步。使用的較多的是採用Kafka
來進行日誌的記錄,關於Kafka
,您能夠百度,若是還有疑惑,諮詢我也能夠。
至此,本節內容講解完畢,歡迎您來探討!我的微信二維碼以下: