作者:Kathleen Dollard
排版:Alan Wang
Visual Studio 17.7 Preview 3 和 .NET 8 Preview 6 的發(fā)布推進了 C# 12的發(fā)展。此預覽版包含的功能為將來的性能增強奠定了基礎(chǔ)?,F(xiàn)在,您能夠在庫中更方便的使用內(nèi)聯(lián)函數(shù)。此預覽版首次推出了一項實驗性功能:攔截器。該功能允許生成器重新路由代碼,例如提供特定于上下文的優(yōu)化。最后,nameof
功能得到增強,您可以在更多的地方使用它。
安裝最新的 Visual Studio 預覽版或最新版本的 .NET SDK 來使用 C# 12 。將項目的語言版本設置為 preview,就可查看 C# 12 的功能:
<PropertyGroup>
<LangVersion>preview</LangVersion>
</PropertyGroup>
由于這是實驗性的功能,所以攔截器需要在項目文件中添加一個附加標志。
nameof 訪問實例成員
nameof
關(guān)鍵字現(xiàn)在可用于成員名稱,如初始化器、靜態(tài)成員以及屬性:
internal class NameOf
{
public string S { get; } = "";
public static int StaticField;
public string NameOfLength { get; } = nameof(S.Length);
public static void NameOfExamples()
{
Console.WriteLine(nameof(S.Length));
Console.WriteLine(nameof(StaticField.MinValue));
}
[Description($"String {nameof(S.Length)}")]
public int StringLength(string s)
{ return s.Length; }
}
您可以在 C# 12 的新增功能中了解更多信息。
內(nèi)聯(lián)數(shù)組
InlineArrayAttribute 是在以前的 .NET 8 預覽版中引入到運行時的。 這是一項高級功能,主要由編譯器、.NET 庫和其他一些庫使用。 該屬性標識了一種可被視為連續(xù)基元序列的類型,以實現(xiàn)高效、類型安全、越界安全的可索引/可切分內(nèi)聯(lián)數(shù)據(jù)。 .NET 庫使用內(nèi)聯(lián)數(shù)組提高應用程序和工具的性能。
編譯器創(chuàng)建不同的 IL 來訪問內(nèi)聯(lián)數(shù)組。 這會導致一些限制,例如不支持列表模式。 在大多數(shù)情況下,您可以像訪問其他數(shù)組一樣訪問內(nèi)聯(lián)數(shù)組。 不同的 IL 可以在不更改代碼的情況下提高性能:
private static void InlineArrayAccess(Buffer10<int> inlineArray)
{
for (int i = 0; i < 10; i++)
{
inlineArray[i] = i * i;
}
foreach (int i in inlineArray)
{
Console.WriteLine(i);
}
}
對于內(nèi)聯(lián)數(shù)組,大多數(shù)人傾向于使用,而不是創(chuàng)建。 但是,了解事物的運作方式大有裨益。 內(nèi)聯(lián)數(shù)組速度很快,因為它們依賴于指定長度的精確布局。 內(nèi)聯(lián)數(shù)組是一種具有單個字段的類型,并用指定數(shù)組長度的 InlineArrayAttribute
進行標記。 在上一個示例中使用的類型中,由于屬性參數(shù),運行時會在 Buffer10<T>
中為10個元素創(chuàng)建存儲空間:
[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer10<T>
{
private T _element0;
}
您可以在 C# 12的新增功能中了解更多信息。
攔截器
此預覽版引入了一項名為攔截器的實驗性功能。它適用于一些高級場景,特別是允許更好的提前編譯(AOT)。作為 .NET 8 的實驗部分,在未來版本中它可能會被更改或刪除。因此,先不要在生產(chǎn)中使用這項功能。
攔截器允許將特定方法調(diào)用重新路由到不同的代碼。屬性指定實際的源代碼位置,因此攔截器通常僅適用于源生成器。您可以閱讀攔截器提案以了解有關(guān)攔截器如何工作的更多信息。
由于攔截器是一項實驗性功能,因此您需要在項目文件中顯式啟用它們:
<PropertyGroup>
<Features>InterceptorsPreview</Features>
</PropertyGroup>
攔截器可以實現(xiàn)絕佳的代碼模式。以下是一些例子:
- 可以攔截編譯時已知的調(diào)用,例如具有常量模式的
Regex.IsMatch(@"a+b+")
,并使用靜態(tài)生成的代碼進行優(yōu)化,以便更好地適用于提前編譯(AOT)環(huán)境 。 - 可以攔截諸如
app.MapGet("/products", handler: (int? page, int? pageLength, MyDb db) => { ... })
之類的 ASP.NET Minimal API 調(diào)用來注冊一個靜態(tài)生成的 thunk,該 thunk 會直接調(diào)用用戶的處理程序,從而跳過分配和間接。 - 在矢量化中,foreach 循環(huán)包含對用戶方法的調(diào)用,編譯器可以重寫代碼以在運行時檢查和使用相關(guān)的內(nèi)部函數(shù),但如果這些內(nèi)部函數(shù)不可用,則返回到原始代碼。
- 依賴注入的靜態(tài)依賴圖解析,其中
provider.Register<MyService>()
可以被攔截。 - 可以攔截對查詢提供程序的調(diào)用,以在編譯時提供對另一種語言(例如 SQL)的翻譯,而不是評估表達式樹以在運行時進行翻譯。
- 序列化器可以根據(jù)具體的調(diào)用類型(如
Serialize<MyType>()
)生成特定于類型的(反)序列化,所有這些都在編譯時進行。
雖然大多數(shù)程序員不會直接使用攔截器,但我們?nèi)韵M軌蛟陂_發(fā)中發(fā)揮重要作用,使您的應用程序更快運行并更易部署。攔截器預計在 C# 12/.NET 8 版本中仍保持實驗階段,并可能包含在 C# 的后續(xù)版本中。
總結(jié)
您可以在 Microsoft Learn 的 C# 12 新增功能頁面上找到有關(guān)迄今為止引入的所有功能的更多信息,并在 Roslyn 功能狀態(tài)頁面上跟蹤 C# 12 功能的演變。
您可以通過下載最新的 Visual Studio 預覽版或最新版本的 .NET SDK 并在您的項目文件中將 LangVersion
設置 preview
來查看最新的 C# 12 功能。文章來源:http://www.zghlxwxcb.cn/news/detail-628035.html
請讓我們知道您的想法!文章來源地址http://www.zghlxwxcb.cn/news/detail-628035.html
到了這里,關(guān)于C# 12 預覽版的新功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!