系統(tǒng)之家 - 系統(tǒng)光盤下載網(wǎng)站!

當(dāng)前位置:系統(tǒng)之家 > IT快訊 > 詳細頁面

微軟正式發(fā)布C#10,支持.NET 6和Visual Studio2022!(附更新內(nèi)容大全)

編輯:小敏敏 2022-02-12 13:58:48 來源于:互聯(lián)網(wǎng)

  系統(tǒng)之家消息,據(jù)微軟中國 MSDN,宣布 C# 10 作為 .NET 6 和 Visual Studio 2022 的一部分已經(jīng)發(fā)布了。在這篇文章中,微軟將介紹 C# 10 的許多新功能,這些功能使你的代碼更漂亮、更具表現(xiàn)力、更快。

微軟正式發(fā)布C#10

  閱讀 Visual Studio 2022 公告和.NET 6 公告以了解更多信息,包括如何安裝。

  Visual Studio 2022 公告

  https://aka.ms/vs2022gablog

  .NET 6

  https://aka.ms/dotnet6-GA

  全局和隱式 usings

  using 指令簡化了你使用命名空間的方式。C# 10 包括一個新的全局 using 指令和隱式 usings,以減少你需要在每個文件頂部指定的 usings 數(shù)量。

  全局 using 指令

  如果關(guān)鍵字 global 出現(xiàn)在 using 指令之前,則 using 適用于整個項目:

  1. 01global using System;
復(fù)制代碼
global using System;

  你可以在全局 using 指令中使用 using 的任何功能。例如,添加靜態(tài)導(dǎo)入類型并使該類型的成員和嵌套類型在整個項目中可用。如果你在 using 指令中使用別名,該別名也會影響你的整個項目:

  1. 01global using static System.Console;
  2. 02global using Env = System.Environment;
復(fù)制代碼
global using static System.Console; global using Env = System.Environment;

  你可以將全局使用放在任何 .cs 文件中,包括 Program.cs 或?qū)iT命名的文件,如 globalusings.cs。全局 usings 的范圍是當(dāng)前編譯,一般對應(yīng)當(dāng)前項目。

  有關(guān)詳細信息,請參閱全局 using 指令。

  全局 using 指令

  https://docs.microsoft.com/dotnet/csharp/languagereference/keywords/using-directive#global-modifier

  隱式 usings

  隱式 usings 功能會自動為你正在構(gòu)建的項目類型添加通用的全局 using 指令。要啟用隱式 usings,請在 .csproj 文件中設(shè)置 ImplicitUsings 屬性:

  1. 01<PropertyGroup>
  2. 02    <!-- Other properties like OutputType and TargetFramework -->
  3. 03    <ImplicitUsings>enable</ImplicitUsings>
  4. 04</PropertyGroup>
復(fù)制代碼
<PropertyGroup>     <!-- Other properties like OutputType and TargetFramework -->     <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup>

  在新的 .NET 6 模板中啟用了隱式 usings 。在此博客文章中閱讀有關(guān) .NET 6 模板更改的更多信息。

  一些特定全局 using 指令集取決于你正在構(gòu)建的應(yīng)用程序的類型。例如,控制臺應(yīng)用程序或類庫的隱式 usings 不同于 ASP.NET 應(yīng)用程序的隱式 usings。

  有關(guān)詳細信息,請參閱此隱式 usings 文章。

  博客文章

  https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-7/#net-sdk-c-project-templates-modernized

  隱式 usings

  https://docs.microsoft.com/en-us/dotnet/core/project-sdk/overview#implicit-using-directives

  Combining using 功能

  文件頂部的傳統(tǒng) using 指令、全局 using 指令和隱式 using 可以很好地協(xié)同工作。隱式 using 允許你在項目文件中包含適合你正在構(gòu)建的項目類型的 .NET 命名空間。全局 using 指令允許你包含其他命名空間,以使它們在整個項目中可用。代碼文件頂部的 using 指令允許你包含項目中僅少數(shù)文件使用的命名空間。

  無論它們是如何定義的,額外的 using 指令都會增加名稱解析中出現(xiàn)歧義的可能性。如果遇到這種情況,請考慮添加別名或減少要導(dǎo)入的命名空間的數(shù)量。例如,你可以將全局 using 指令替換為文件子集頂部的顯式 using 指令。

  如果你需要刪除通過隱式 usings 包含的命名空間,你可以在項目文件中指定它們:

  1. 01<ItemGroup>
  2. 02  <Using Remove="System.Threading.Tasks" />
  3. 03</ItemGroup>
復(fù)制代碼
<ItemGroup>   <Using Remove="System.Threading.Tasks" /> </ItemGroup>

  你還可以添加命名空間,就像它們是全局 using 指令一樣,你可以將 Using 項添加到項目文件中,例如:

  1. 01<ItemGroup>
  2. 02  <Using Include="System.IO.Pipes" />
  3. 03</ItemGroup>
復(fù)制代碼
<ItemGroup>   <Using Include="System.IO.Pipes" /> </ItemGroup>

  文件范圍的命名空間

  許多文件包含單個命名空間的代碼。從 C# 10 開始,你可以將命名空間作為語句包含在內(nèi),后跟分號且不帶花括號:

  1. 01namespace MyCompany.MyNamespace;
  2. 02class MyClass // Note: no indentation
  3. 03{ ... }
復(fù)制代碼
namespace MyCompany.MyNamespace; class MyClass // Note: no indentation { ... }

  他簡化了代碼并刪除了嵌套級別。只允許一個文件范圍的命名空間聲明,并且它必須在聲明任何類型之前出現(xiàn)。

  有關(guān)文件范圍命名空間的更多信息,請參閱命名空間關(guān)鍵字文章。

  命名空間關(guān)鍵字文章 https://docs.microsoft.com/ dotnet / csharp / languagereference / keywords / namespace

  對 lambda 表達式和方法組的改進

  微軟對 lambda 的語法和類型進行了多項改進。微軟預(yù)計這些將廣泛有用,并且驅(qū)動方案之一是使 ASP.NET Minimal API 更加簡單。

  lambda 的語法

  https://docs.microsoft.com/dotnet/csharp/whats-new/csharp-10#lambda-expression-improvements

  ASP.NET Minimal API

  https://devblogs.microsoft.com/dotnet/announcing-asp-net-core-in-net-6/

  lambda 的自然類型

  Lambda 表達式現(xiàn)在有時具有“自然”類型。這意味著編譯器通常可以推斷出 lambda 表達式的類型。

  到目前為止,必須將 lambda 表達式轉(zhuǎn)換為委托或表達式類型。在大多數(shù)情況下,你會在 BCL 中使用重載的 Func《。。! 或 Action《。。! 委托類型之一:

  1. 01Func<string, int> parse = (string s) => int.Parse(s);
復(fù)制代碼
Func<string, int> parse = (string s) => int.Parse(s);

  但是,從 C# 10 開始,如果 lambda 沒有這樣的“目標類型”,微軟將嘗試為你計算一個:

  1. 01var parse = (string s) => int.Parse(s);
復(fù)制代碼
var parse = (string s) => int.Parse(s);

  你可以在你最喜歡的編輯器中將鼠標懸停在 var parse 上,然后查看類型仍然是 Func《string, int》。一般來說,編譯器將使用可用的 Func 或 Action 委托(如果存在合適的委托)。否則,它將合成一個委托類型(例如,當(dāng)你有 ref 參數(shù)或有大量參數(shù)時)。

  并非所有 lambda 表達式都有自然類型 —— 有些只是沒有足夠的類型信息。例如,放棄參數(shù)類型將使編譯器無法決定使用哪種委托類型:

  1. 01var parse = s => int.Parse(s); // ERROR: Not enough type info in the lambda
復(fù)制代碼
var parse = s => int.Parse(s); // ERROR: Not enough type info in the lambda

  lambda 的自然類型意味著它們可以分配給較弱的類型,例如 object 或 Delegate:

  1. 01object parse = (string s) => int.Parse(s);   // Func<string, int>
  2. 02Delegate parse = (string s) => int.Parse(s); // Func<string, int>
復(fù)制代碼
object parse = (string s) => int.Parse(s);   // Func<string, int> Delegate parse = (string s) => int.Parse(s); // Func<string, int>

  當(dāng)涉及到表達式樹時,微軟結(jié)合了“目標”和“自然”類型。如果目標類型是 LambdaExpression 或非泛型 Expression(所有表達式樹的基類型)并且 lambda 具有自然委托類型 D,微軟將改為生成 Expression《D》:

  1. 01LambdaExpression parseExpr = (string s) => int.Parse(s); // Expression<Func<string, int>>
  2. 02Expression parseExpr = (string s) => int.Parse(s);       // Expression<Func<string, int>>
復(fù)制代碼
LambdaExpression parseExpr = (string s) => int.Parse(s); // Expression<Func<string, int>> Expression parseExpr = (string s) => int.Parse(s);       // Expression<Func<string, int>>

  方法組的自然類型

  方法組(即沒有參數(shù)列表的方法名稱)現(xiàn)在有時也具有自然類型。你始終能夠?qū)⒎椒ńM轉(zhuǎn)換為兼容的委托類型:

  1. 01Func<int> read = Console.Read;
  2. 02Action<string> write = Console.Write;
復(fù)制代碼
Func<int> read = Console.Read; Action<string> write = Console.Write;

  現(xiàn)在,如果方法組只有一個重載,它將具有自然類型:

  1. 01var read = Console.Read; // Just one overload; Func<int> inferred
  2. 02var write = Console.Write; // ERROR: Multiple overloads, can't choose
復(fù)制代碼
var read = Console.Read; // Just one overload; Func<int> inferred var write = Console.Write; // ERROR: Multiple overloads, can't choose

  lambda 的返回類型

  在前面的示例中,lambda 表達式的返回類型是顯而易見的,并被推斷出來的。情況并非總是如此:

  1. 01var choose = (bool b) => b ? 1 : "two"; // ERROR: Can't infer return type
復(fù)制代碼
var choose = (bool b) => b ? 1 : "two"; // ERROR: Can't infer return type

  在 C# 10 中,你可以在 lambda 表達式上指定顯式返回類型,就像在方法或本地函數(shù)上一樣。返回類型在參數(shù)之前。當(dāng)你指定一個顯式的返回類型時,參數(shù)必須用括號括起來,這樣編譯器或其他開發(fā)人員不會太混淆:

  1. 01var choose = object (bool b) => b ? 1 : "two"; // Func<bool, object>
復(fù)制代碼
var choose = object (bool b) => b ? 1 : "two"; // Func<bool, object>

  lambda 上的屬性

  從 C# 10 開始,你可以將屬性放在 lambda 表達式上,就像對方法和本地函數(shù)一樣。當(dāng)有屬性時,lambda 的參數(shù)列表必須用括號括起來:

  1. 01Func<string, int> parse = [Example(1)] (s) => int.Parse(s);
  2. 02var choose = [Example(2)][Example(3)] object (bool b) => b ? 1 : "two";
復(fù)制代碼
Func<string, int> parse = [Example(1)] (s) => int.Parse(s); var choose = [Example(2)][Example(3)] object (bool b) => b ? 1 : "two";

  就像本地函數(shù)一樣,如果屬性在 AttributeTargets.Method 上有效,則可以將屬性應(yīng)用于 lambda。

  Lambda 的調(diào)用方式與方法和本地函數(shù)不同,因此在調(diào)用 lambda 時屬性沒有任何影響。但是,lambdas 上的屬性對于代碼分析仍然有用,并且可以通過反射發(fā)現(xiàn)它們。

  structs 的改進

  C# 10 為 structs 引入了功能,可在 structs (結(jié)構(gòu)) 和類之間提供更好的奇偶性。這些新功能包括無參數(shù)構(gòu)造函數(shù)、字段初始值設(shè)定項、記錄結(jié)構(gòu)和 with 表達式。

  01 無參數(shù)結(jié)構(gòu)構(gòu)造函數(shù)和字段初始值設(shè)定項

  在 C# 10 之前,每個結(jié)構(gòu)都有一個隱式的公共無參數(shù)構(gòu)造函數(shù),該構(gòu)造函數(shù)將結(jié)構(gòu)的字段設(shè)置為默認值。在結(jié)構(gòu)上創(chuàng)建無參數(shù)構(gòu)造函數(shù)是錯誤的。

  從 C# 10 開始,你可以包含自己的無參數(shù)結(jié)構(gòu)構(gòu)造函數(shù)。如果你不提供,則將提供隱式無參數(shù)構(gòu)造函數(shù)以將所有字段設(shè)置為默認值。你在結(jié)構(gòu)中創(chuàng)建的無參數(shù)構(gòu)造函數(shù)必須是公共的并且不能是部分的:

  1. 01public struct Address
  2. 02{
  3. 03    public Address()
  4. 04    {
  5. 05        City = "<unknown>";
  6. 06    }
  7. 07    public string City { get; init; }
  8. 08}
復(fù)制代碼
public struct Address {     public Address()     {         City = "<unknown>";     }     public string City { get; init; } }

  你可以如上所述在無參數(shù)構(gòu)造函數(shù)中初始化字段,也可以通過字段或?qū)傩猿跏蓟绦虺跏蓟鼈儯?/p>

  1. 01public struct Address
  2. 02{
  3. 03    public string City { get; init; } = "<unknown>";
  4. 04}
復(fù)制代碼
public struct Address {     public string City { get; init; } = "<unknown>"; }

  通過默認創(chuàng)建或作為數(shù)組分配的一部分創(chuàng)建的結(jié)構(gòu)會忽略顯式無參數(shù)構(gòu)造函數(shù),并始終將結(jié)構(gòu)成員設(shè)置為其默認值。有關(guān)結(jié)構(gòu)中無參數(shù)構(gòu)造函數(shù)的更多信息,請參閱結(jié)構(gòu)類型。

  02 Record structs

  從 C# 10 開始,現(xiàn)在可以使用 record struct 定義 record。這些類似于 C# 9 中引入的 record 類:

  1. 01public record struct Person
  2. 02{
  3. 03    public string FirstName { get; init; }
  4. 04    public string LastName { get; init; }
  5. 05}
復(fù)制代碼
public record struct Person {     public string FirstName { get; init; }     public string LastName { get; init; } }

  你可以繼續(xù)使用 record 定義記錄類,也可以使用 record 類來清楚地說明。

  結(jié)構(gòu)已經(jīng)具有值相等 —— 當(dāng)你比較它們時,它是按值。記錄結(jié)構(gòu)添加 IEquatable《T》 支持和 == 運算符。記錄結(jié)構(gòu)提供 IEquatable《T》 的自定義實現(xiàn)以避免反射的性能問題,并且它們包括記錄功能,如 ToString () 覆蓋。

  記錄結(jié)構(gòu)可以是位置的,主構(gòu)造函數(shù)隱式聲明公共成員:

  1. 01public record struct Person(string FirstName, string LastName);
復(fù)制代碼
public record struct Person(string FirstName, string LastName);

  主構(gòu)造函數(shù)的參數(shù)成為記錄結(jié)構(gòu)的公共自動實現(xiàn)屬性。與 record 類不同,隱式創(chuàng)建的屬性是讀 / 寫的。這使得將元組轉(zhuǎn)換為命名類型變得更加容易。將返回類型從 (string FirstName, string LastName) 之類的元組更改為 Person 的命名類型可以清理你的代碼并保證成員名稱一致。聲明位置記錄結(jié)構(gòu)很容易并保持可變語義。

  如果你聲明一個與主要構(gòu)造函數(shù)參數(shù)同名的屬性或字段,則不會合成任何自動屬性并使用你的。

  要創(chuàng)建不可變的記錄結(jié)構(gòu),請將 readonly 添加到結(jié)構(gòu)(就像你可以添加到任何結(jié)構(gòu)一樣)或?qū)?readonly 應(yīng)用于單個屬性。對象初始化器是可以設(shè)置只讀屬性的構(gòu)造階段的一部分。這只是使用不可變記錄結(jié)構(gòu)的一種方法:

  1. 01var person = new Person { FirstName = "Mads", LastName = "Torgersen"};
  2. 02public readonly record struct Person
  3. 03{
  4. 04    public string FirstName { get; init; }
  5. 05    public string LastName { get; init; }
  6. 06}
復(fù)制代碼
var person = new Person { FirstName = "Mads", LastName = "Torgersen"}; public readonly record struct Person {     public string FirstName { get; init; }     public string LastName { get; init; } }

  在本文中了解有關(guān)記錄結(jié)構(gòu)的更多信息。

  記錄結(jié)構(gòu)

  https://docs.microsoft.com/dotnet/csharp/language-reference/builtin-types/record

  03 Record 類中 ToString () 上的密封修飾符

  記錄類也得到了改進。從 C# 10 開始,ToString () 方法可以包含 seal 修飾符,這會阻止編譯器為任何派生記錄合成 ToString 實現(xiàn)。

  在本文中的記錄中了解有關(guān) ToString () 的更多信息。

  有關(guān) ToString () 的更多信息

  https://docs.microsoft.com/dotnet/csharp/language-reference/builtin-types/record#built-in-formatting-for-display

  04 結(jié)構(gòu)和匿名類型的表達式

  C# 10 支持所有結(jié)構(gòu)的 with 表達式,包括記錄結(jié)構(gòu),以及匿名類型:

  1. 01var person2 = person with { LastName = "Kristensen" };
復(fù)制代碼
var person2 = person with { LastName = "Kristensen" };

  這將返回一個具有新值的新實例。你可以更新任意數(shù)量的值。你未設(shè)置的值將保留與初始實例相同的值。

  在本文中了解有關(guān) with 的更多信息

  了解有關(guān) with 的更多信息

  https://docs.microsoft.com/dotnet/csharp/language-reference/builtin-types/record#built-in-formatting-for-display

  內(nèi)插字符串改進

  當(dāng)微軟在 C# 中添加內(nèi)插字符串時,微軟總覺得在性能和表現(xiàn)力方面,使用該語法可以做更多事情。

  01 內(nèi)插字符串處理程序

  今天,編譯器將內(nèi)插字符串轉(zhuǎn)換為對 string.Format 的調(diào)用。這會導(dǎo)致很多分配 —— 參數(shù)的裝箱、參數(shù)數(shù)組的分配,當(dāng)然還有結(jié)果字符串本身。此外,它在實際插值的含義上沒有任何回旋余地。

  在 C# 10 中,微軟添加了一個庫模式,允許 API“接管”對內(nèi)插字符串參數(shù)表達式的處理。例如,考慮 StringBuilder.Append:

  1. 01var sb = new StringBuilder();
  2. 02sb.Append($"Hello {args[0]}, how are you?");
復(fù)制代碼
var sb = new StringBuilder(); sb.Append($"Hello {args[0]}, how are you?");

  到目前為止,這將使用新分配和計算的字符串調(diào)用 Append (string? value) 重載,將其附加到 StringBuilder 的一個塊中。但是,Append 現(xiàn)在有一個新的重載 Append (refStringBuilder.AppendInterpolatedStringHandler handler),當(dāng)使用內(nèi)插字符串作為參數(shù)時,它優(yōu)先于字符串重載。

  通常,當(dāng)你看到 SomethingInterpolatedStringHandler 形式的參數(shù)類型時,API 作者在幕后做了一些工作,以更恰當(dāng)?shù)靥幚聿逯底址詽M足其目的。在微軟的 Append 示例中,字符串“Hello”、args [0] 和“,how are you?”將單獨附加到 StringBuilder 中,這樣效率更高且結(jié)果相同。

  有時你只想在特定條件下完成構(gòu)建字符串的工作。一個例子是 Debug.Assert:

  1. 01Debug.Assert(condition, $"{SomethingExpensiveHensHere()}");
復(fù)制代碼
Debug.Assert(condition, $"{SomethingExpensiveHensHere()}");

  在大多數(shù)情況下,條件為真,第二個參數(shù)未使用。但是,每次調(diào)用都會計算所有參數(shù),從而不必要地減慢執(zhí)行速度。Debug.Assert 現(xiàn)在有一個帶有自定義插值字符串構(gòu)建器的重載,它確保第二個參數(shù)甚至不被評估,除非條件為假。

  最后,這是一個在給定調(diào)用中實際更改字符串插值行為的示例:String.Create () 允許你指定 IFormatProvider 用于格式化插值字符串參數(shù)本身的洞中的表達式:

  1. 01String.Create(CultureInfo.InvariantCulture, $"The result is {result}");
復(fù)制代碼
String.Create(CultureInfo.InvariantCulture, $"The result is {result}");

  你可以在本文和有關(guān)創(chuàng)建自定義處理程序的本教程中了解有關(guān)內(nèi)插字符串處理程序的更多信息。

  創(chuàng)建自定義處理程序

  https://docs.microsoft.com/dotnet/csharp/languagereference/tokens/interpolated#compilation-of-interpolated-strings

  內(nèi)插字符串處理程序的更多信息

  https://docs.microsoft.com/dotnet/csharp/whats-new/tutorials/interpolated-string-handler

  02 常量內(nèi)插字符串

  如果內(nèi)插字符串的所有洞都是常量字符串,那么生成的字符串現(xiàn)在也是常量。這使你可以在更多地方使用字符串插值語法,例如屬性:

  1. 01[Obsolete($"Call {nameof(Discard)} instead")]
復(fù)制代碼
[Obsolete($"Call {nameof(Discard)} instead")]

  請注意,必須用常量字符串填充洞。其他類型,如數(shù)字或日期值,不能使用,因為它們對文化敏感,并且不能在編譯時計算。

  其他改進

  C# 10 對整個語言進行了許多較小的改進。其中一些只是使 C# 以你期望的方式工作。

  在解構(gòu)中混合聲明和變量

  在 C# 10 之前,解構(gòu)要求所有變量都是新的,或者所有變量都必須事先聲明。在 C# 10 中,你可以混合:

  1. 01int x2;
  2. 02int y2;
  3. 03(x2, y2) = (0, 1);       // Works in C# 9
  4. 04(var x, var y) = (0, 1); // Works in C# 9
  5. 05(x2, var y3) = (0, 1);   // Works in C# 10 onwards
復(fù)制代碼
int x2; int y2; (x2, y2) = (0, 1);       // Works in C# 9 (var x, var y) = (0, 1); // Works in C# 9 (x2, var y3) = (0, 1);   // Works in C# 10 onwards

  在有關(guān)解構(gòu)的文章中了解更多信息。

  改進的明確分配

  如果你使用尚未明確分配的值,C# 會產(chǎn)生錯誤。C# 10 可以更好地理解你的代碼并且產(chǎn)生更少的虛假錯誤。這些相同的改進還意味著你將看到更少的針對空引用的虛假錯誤和警告。

  在 C# 10 中的新增功能文章中了解有關(guān) C# 確定賦值的更多信息。

  C# 10 中的新增功能文章

  https://docs.microsoft.com/dotnet/csharp/whats-new/csharp-10#improved-definite-assignment

  擴展的屬性模式

  C# 10 添加了擴展屬性模式,以便更輕松地訪問模式中的嵌套屬性值。例如,如果微軟在上面的 Person 記錄中添加一個地址,微軟可以通過以下兩種方式進行模式匹配:

  1. 01object obj = new Person
  2. 02{
  3. 03    FirstName = "Kathleen",
  4. 04    LastName = "Dollard",
  5. 05    Address = new Address { City = "Seattle" }
  6. 06};
  7. 07if (obj is Person { Address: { City: "Seattle" } })
  8. 08    Console.WriteLine("Seattle");
  9. 09if (obj is Person { Address.City: "Seattle" }) // Extended property pattern
  10. 10    Console.WriteLine("Seattle");
復(fù)制代碼
object obj = new Person {     FirstName = "Kathleen",     LastName = "Dollard",     Address = new Address { City = "Seattle" } }; if (obj is Person { Address: { City: "Seattle" } })     Console.WriteLine("Seattle"); if (obj is Person { Address.City: "Seattle" }) // Extended property pattern     Console.WriteLine("Seattle");

  擴展屬性模式簡化了代碼并使其更易于閱讀,尤其是在匹配多個屬性時。

  在模式匹配文章中了解有關(guān)擴展屬性模式的更多信息。

  模式匹配文章

  https://docs.microsoft.com/dotnet/csharp/languagereference/operators/patterns#property-pattern

  調(diào)用者表達式屬性

  CallerArgumentExpressionAttribute 提供有關(guān)方法調(diào)用上下文的信息。與其他 CompilerServices 屬性一樣,此屬性應(yīng)用于可選參數(shù)。在這種情況下,一個字符串:

  1. 01void CheckExpression(bool condition, 
  2. 02    [CallerArgumentExpression("condition")] string? message = null )
  3. 03{
  4. 04    Console.WriteLine($"Condition: {message}");
  5. 05}
復(fù)制代碼
void CheckExpression(bool condition,      [CallerArgumentExpression("condition")] string? message = null ) {     Console.WriteLine($"Condition: {message}"); }

  傳遞給 CallerArgumentExpression 的參數(shù)名稱是不同參數(shù)的名稱。作為參數(shù)傳遞給該參數(shù)的表達式將包含在字符串中。例如,

  1. 01var a = 6;
  2. 02var b = true;
  3. 03CheckExpression(true);
  4. 04CheckExpression(b);
  5. 05CheckExpression(> 5);
  6. 06// Output:
  7. 07// Condition: true
  8. 08// Condition: b
  9. 09// Condition: a > 5
復(fù)制代碼
var a = 6; var b = true; CheckExpression(true); CheckExpression(b); CheckExpression(> 5); // Output: // Condition: true // Condition: b // Condition: a > 5

  ArgumentNullException.ThrowIfNull () 是如何使用此屬性的一個很好的示例。它通過默認提供的值來避免必須傳入?yún)?shù)名稱:

  1. 01void MyMethod(object value){    ArgumentNullException.ThrowIfNull(value);}
復(fù)制代碼
void MyMethod(object value){    ArgumentNullException.ThrowIfNull(value);}

  了解有關(guān) CallerArgumentExpressionAttribute 的更多信息

  https://docs.microsoft.com/dotnet/csharp/languagereference/attributes/caller-information#argument-expressions

  熱門系統(tǒng)推薦下載:⭐⭐⭐⭐⭐

  Windows功能體驗包1000.22000.469 V2022.02 >>>>

  Windows 11 V21H2 Build 22000.469 RTM版 V2022.02 >>>>

  xb21cn Windows 11 G版 V21H2(22000.469) V2022.02 >>>>

標簽 微軟

發(fā)表評論

0

沒有更多評論了

評論就這些咯,讓大家也知道你的獨特見解

立即評論

以上留言僅代表用戶個人觀點,不代表系統(tǒng)之家立場

官方交流群 軟件收錄