C# 14 新增功能一覽,你覺得實用嗎?
今天咱們一起來看看在 C# 14 中新增的幾個功能特性,是否給我們日常編碼帶來了便利。
前提準備
要體驗 C# 14 中的新增功能,你需要安裝最新的 Visual Studio 2022 版本或下載 .NET 10 SDK。
下載 .NET 10 SDK:https://dotnet.microsoft.com/zh-cn/download/dotnet/10.0
擴展成員(Extension Members)
從 C# 14 開始,可以使用兩種語法來定義擴展方法。C# 14 添加了 extension 容器,可以聲明擴展塊,擴展塊是包含類型或該類型的實例的擴展成員的非嵌套、非泛型靜態類中的塊。在 C# 14 之前,將修飾符添加到 this 靜態方法的第一個參數,以指示該方法顯示為參數類型的實例的成員。
下面的代碼示例定義了 string 類型的擴展塊。擴展塊包含一個成員:計算字符串中單詞的方法:
C# 14 之前:
namespace CustomExtensionMethods;
public static class MyExtensions
{
public static int WordCount(this string str) =>
str.Split([' ', '.', '?'], StringSplitOptions.RemoveEmptyEntries).Length;
}
C# 14 開始:
namespace CustomExtensionMembers;
public static class MyExtensions
{
extension(string str)
{
public int WordCount() =>
str.Split([' ', '.', '?'], StringSplitOptions.RemoveEmptyEntries).Length;
}
}
field 關鍵字
使用令牌 field 可以編寫屬性訪問器體,而無需聲明后備字段。令牌 field 將替換為編譯器合成支持字段。
例如,C# 14 之前,如果要確保 string 屬性無法設置為 null,則必須聲明一個后備字段并實現這兩個訪問器:
private string _msg;
public string Message
{
get => _msg;
set => _msg = value ?? throw new ArgumentNullException(nameof(value));
}
C# 14 開始,現在可以簡化代碼:
public string Message
{
get;
set => field = value ?? throw new ArgumentNullException(nameof(value));
}
可以為字段支持的屬性的一個或兩個訪問器聲明一個主體。
隱式跨度轉換
C# 14 在語言中引入了對 System.Span<T> 和 System.ReadOnlySpan<T> 的一流支持。這種支持包括新的隱式轉換,使得使用這些類型進行編程更加自然。
在 C# 和運行時中,Span<T> 和 ReadOnlySpan<T> 被用于多種關鍵方式。他們的引入可提高性能,而不會造成安全風險。C# 14 識別其相互關系,并支持在 ReadOnlySpan<T>、Span<T> 和 T[] 之間進行一些轉換。跨度類型可以作為擴展方法的接收器、與其他轉換組合,或者在泛型類型推理場景中提供幫助。
未綁定的泛型類型與nameof
從 C# 14 開始,nameof 的參數可以是未綁定的泛型類型。例如,nameof(List<>) 計算為 List。在早期版本的 C# 中,只能使用關閉的泛型類型(例如 List<int>)返回 List 名稱。
帶修飾符的簡單 lambda 參數
從 C# 14 開始,可以在不指定參數類型的情況下,向 lambda 表達式參數添加參數修飾符,例如:scoped、ref、in、out或 ref readonly。
支持更多部分成員(partial members)
從 C# 14 開始可以將實例構造函數和事件聲明為部分成員(partial members)。
注意:部分構造函數和分部事件必須包含一個定義聲明和一個實現聲明。
Null 條件賦值
Null 條件成員訪問運算符“?.”和“?[]”現在可在賦值或復合賦值的左側使用。
在 C# 14 之前,在分配給屬性之前,需要對變量進行 null 檢查:
public static void GetUserInfo()
{
UserInfo userInfo = null;
if (userInfo is not null)
{
userInfo.Age = CalculateAge(userInfo);
}
}
private static int CalculateAge(UserInfo userInfo)
{
return DateTime.Now.Year - userInfo.Birthday.Year;
}
在 C# 14 中可以使用運算符簡化上述代碼 ?. :
注意:運算符 = 的右側僅在左側不為 null 時才會被計算。如果 userInfo 為 null,則代碼不調用 CalculateAge。
public static void GetUserInfo()
{
UserInfo userInfo = null;
userInfo?.Name = CalculateAge(userInfo);
}
private static int CalculateAge(UserInfo userInfo)
{
return DateTime.Now.Year - userInfo.Birthday.Year;
}
參考文章: