What's new in C# 7.0

来源:https://www.cnblogs.com/yhqclub/archive/2019/05/11/10847565.html
-Advertisement-
Play Games

1.數字分隔符(Digit Separators ) 數字分隔符使代碼更具可讀性。在聲明變數時,可以將_添加到單獨的數字中。編譯器只刪除_。以下代碼片段在C#7中看起來更具可讀性: In C# 6 In C# 7 In C# 7.2 2.二進位(Binary Literals ) C#7為二進位文件 ...


1.數字分隔符(Digit Separators )

數字分隔符使代碼更具可讀性。在聲明變數時,可以將_添加到單獨的數字中。編譯器只刪除_。以下代碼片段在C#7中看起來更具可讀性:

In C# 6

long n1 = 0x1234567890ABCDEF; 

In C# 7

long n2 = 0x1234_5678_90AB_CDEF;

In C# 7.2

long n2 = 0x_1234_5678_90AB_CDEF;

2.二進位(Binary Literals )

C#7為二進位文件提供了一個新的文字。二進位文件只能包含va 0和1。現在,數字分隔符變得尤為重要

In C# 7

uint binary1 = 0b1111_0000_1010_0101_1111_0000_1010_0101;

3.Expression-bodied 函數成員(Expression-Bodied Members )

C#6允許表達式方法和屬性。使用C#7,表達式主體可以與構造函數,析構函數,本地函數,屬性訪問器等一起使用。在這裡,您可以看到C#6和C#7之間的屬性訪問器的區別:

In C# 6

private string _firstName;
public string FirstName
{
    get { return _firstName; }
    set { Set(ref _firstName, value); }
}

In C# 7

private string _firstName;
public string FirstName
{
    get => _firstName; 
    set => Set(ref _firstName, value);
}

4.Out 變數(Out Var)

在C#7之前,必須在使用之前聲明out變數。使用C#7,代碼減少了一行,因為變數可以聲明

使用:

In C# 6

string n = "42";
int result;
if (string.TryParse(n, out result)
{
    Console.WriteLine($"Converting to a number was successful:{result}");
}

 

In C# 7

string n = "42";
if (string.TryParse(n, out var result)
{
    Console.WriteLine($"Converting to a number was successful:{result}");
}

 

5.非尾隨命名參數(Non-Trailing Named Arguments )

使用C#7.2,支持非尾隨命名參數。有關詳細信息,請參閱命名參數和可選參數
In C# 7.0

if (Enum.TryParse(weekdayRecommendation.Entity, ignoreCase:true,result: out DayOfWeek weekday))

{
  reservation.Weekday = weekday;
}

In C# 7.2

 

if (Enum.TryParse(weekdayRecommendation.Entity, ignoreCase:true,out DayOfWeek weekday))
{
  reservation.Weekday = weekday; 
}

6.只讀結構(Readonly Struct )

結構應該是只讀的(有一些例外)。使用C#7.2,可以使用readonly修飾符聲明結構,因此編譯器會驗證結構是否未更改。編譯器也可以使用此保證不複製將其作為參數傳遞的結構,而是將其作為引用傳遞:

In C# 7.2

public readonly struct Dimensions
{
public double Length { get; }
public double Width { get; }
public Dimensions(double length, double width)
{
Length = length;
Width = width;
}
public double Diagonal => Math.Sqrt(Length * Length + Width
* Width);
}

7.In 修飾參數(In Parameters )

C#7.2還允許帶有參數的in修飾符。這可以保證傳遞的值類型不會改變,它可以通過引用傳遞以避免副本:

In C# 7.2

static void CantChange(in AStruct s)
{
  // s can't change
} 

8.private protected 訪問修飾符

C#7.2添加了一個新的訪問修飾符:private protected。訪問修飾符protected internal允許訪問該成員(如果已使用)來自同一程式集中的類型,或來自派生自該類的另一個程式集中的類型。對於private protected,如果類派生自基類並且在同一個程式集中,則只允許使用AND而不是OR訪問。

 

使用C#7.1,定義了一個預設文字,與預設運算符相比,它允許更短的語法。預設運算符總是需要重覆類型,現在不再需要了。

In C# 7.0

int x = default(int);
ImmutableArray<int> arr = default(ImmutableArray<int>);

In C# 7.1

int x = default;
ImmutableArray<int> arr = default;

10.本地函數(Local Functions )

在C#7之前,無法在方法中聲明函數。你可以創建一個lambda表達式並調用它,如C#6代碼片段所示:

In C# 6

public void SomeFunStuff()
{
  Func<int, int, int> add = (x, y) => x + y;
  int result = add(38, 4);
  Console.WriteLine(result);
}

使用C#7,可以在方法中聲明本地函數。只能在方法範圍內訪問本地函數:

In C# 7

public void SomeFunStuff()
{
  int add(int x, int y) => x + y;
  int result = add(38, 4);
  Console.WriteLine(result);
}

11.元組(Tuples )

低於 C# 7.0 的版本中也提供元組,但它們效率低下且不具有語言支持。 這意味著元組元素只能作為 Item1 和 Item2 等引用。C# 7.0 引入了對元組的語言支持,可利用更有效的新元組類型向元組欄位賦予語義名稱。在C#7中,元組是語言的一部分,你可以定義成員的名字:

in C# 6

var t1 = Tuple.Create(42, "astring"); 
int i1 = t1.Item1;
string s1 = t1.Item2;

In C# 7

var t1 = (n: 42, s: "magic");
int i1 = t1.n;
string s1 = t1.s;

12.推斷元組元素名稱(Inferred Tuple Names )

此功能是對 C# 7.0 中引入的元組功能一次小型增強。 在初始化元組時,許多時候,賦值操作右側的變數名與用於元組元素的名稱相同,元組元素的名稱可通過在 C# 7.1 中初始化元組時使用的變數進行推斷: 

In C# 7.0

int count = 5;
string label = "Colors used in the map";
var pair = (count: count, label: label);

In C# 7.1

int count = 5;
string label = "Colors used in the map";
var pair = (count, label); // element names are "count" and "label"

13.析構元組(Deconstructors )

在某些時候,你可能想要解包從方法返回的元組的成員。 可通過為元組中的每個值聲明單獨的變數來實現此目的。 這種解包操作稱為析構元組

In C# 7

var p1 = new Person("Tom", "Turbo");
(string firstName, string lastName) = p1;

14.模式匹配(Pattern Matching )

通過模式匹配,is運算符和switch語句增強了三種模式:const模式,類型模式和var模式。以下代碼段顯示

使用is運算符的模式。匹配的第一次檢查與常量42匹配,第二次匹配檢查Person對象,第三次匹配檢查具有var模式的每個對象。使用類型和var模式,可以為強類型訪問聲明變數:

In C# 7

public void PatternMatchingWithIsOperator(object o)
{
  if (o is 42)
  {
  }
  if (o is Person p)
  {
  }
  if (o is var v1)
  {
  }
}

使用switch語句,可以對case子句使用相同的模式。如果模式匹配,您還可以聲明要強類型的變數。您還可以使用何時在條件上過濾模式:

public void PatternMatchingWithSwitchStatement(object o)
{
  swtich (o)
  {
    case 42:
    break; 
    case Person p when p.FirstName == "Katharina":
    break;
    case Person p:
    break;
    case var v:
    break;
  }
}

註:使用 when 關鍵字來指定模式的其他規則。

15.Throw表達式(Throw Expressions )

拋出異常只能通過聲明來實現;在表達中是不可能的。因此,當使用構造函數接收參數時,需要額外檢查null以拋出ArgumentNullException。使用C#7,可以在表達式中拋出異常,因此當左側為空時,可以使用合併運算符拋出ArgumentNullException

In C# 6

private readonly IBooksService _booksService;
public BookController(BooksService booksService)
{
  if (booksService == null)
  {
    throw new ArgumentNullException(nameof(b));
  }
  _booksService = booksService;
}

In C# 7

private readonly IBooksService _booksService;
public BookController(BooksService booksService)
{
  _booksService = booksService ?? throw new ArgumentNullException(nameof(b));
}

16.非同步Main方法

在C#7.1之前,Main方法總是需要聲明為void類型。用C#7。1,Main方法也可以是Task類型,並使用async和await關鍵字:
In C# 7.0

static void Main()
{
  SomeMethodAsync().Wait();
}

In C# 7.1

async static Task Main()
{
  await SomeMethodAsync();
}

17.條件Ref表達式

以下代碼片段聲明方法GetNumber以返回對int的引用。這條路,調用者可以直接訪問數組中的元素,並可以更改其內容:

In C# 7.0

int[] _numbers = { 3, 7, 11, 15, 21 };
public ref int GetNumber(int index)
{
return ref _numbers[index];
} 

In C# 7.2

變數 r 是對 arr 或 otherArr 中第一個值的引用。

ref var r = ref (arr != null ? ref arr[0] : ref otherArr[0]);

擴展:

1.使用C#7.2,可以將readonly修飾符添加到ref返回。調用者接收引用但不允許更改它:

In C# 7.2

int[] _numbers = { 3, 7, 11, 15, 21 };
public ref readonly int GetNumber(int index)
{
    return ref _numbers[index];
}

2.ref Struct (在C#7.2之前,C#可以創建引用類型(類)和值類型(結構)。但是,當發生裝箱時,結構也可以存儲在堆上。用C#7.2,可以聲明只允許在堆棧上使用的類型:ref struct)

In C# 7.2

ref struct OnlyOnTheStack
{
} 

C# 更多語法糖請參閱微軟官方文檔.https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/index


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題目鏈接 Description A power network consists of nodes (power stations, consumers and dispatchers) connected by power transport lines. A node u may be sup ...
  • 寫了一個練手的爬蟲...在輸出的時候出現了讓人很不愉♂悅的問題 像這樣: 寫了一個練手的爬蟲...在輸出的時候出現了讓人很不愉♂悅的問題 像這樣: 令人十分難受啊! # 令人十分難受啊! # 在此之前先說一下python中的.format格式化輸出 python2.6開始,可以使用str.forma ...
  • JAVA語言 Java分為三個體系: •JavaSE(J2SE)(Java 2 Platform Standard Edition,java平臺標準版)主要用於桌面級的應用和資料庫的開發,包含構成Java語言核心的類, 如資料庫連接、 介面定義、輸入/輪出和網路編程。 •JavaEE(J2EE)(J ...
  • if判斷 我們人有判斷的功能,電腦既然模仿人,那就也一定有判斷的功能。 Python中的判斷使用 “if” 判斷語法 if判斷是乾什麼的呢?if判斷其實是在模擬人做判斷。就是說如果這樣乾什麼,如果那樣乾什麼 if 條件: 代碼塊 代碼1 代碼2 代碼3 ... 代表快(同一縮進級別的代碼,列如代碼 ...
  • 一 什麼是消息隊列 我們可以把消息隊列比作是一個存放消息的容器,當我們需要使用消息的時候可以取出消息供自己使用。消息隊列是分散式系統中重要的組件,使用消息隊列主要是為了通過非同步處理提高系統性能和削峰、降低系統耦合性。目前使用較多的消息隊列有ActiveMQ,RabbitMQ,Kafka,Rocket ...
  • 基於flask的網頁聊天室(二) 前言 接上一次的內容繼續完善,今天完成的內容不是很多,只是簡單的用戶註冊登錄,內容具體如下 具體內容 這次要加入與數據哭交互的操作,所以首先要建立相關表結構,這裡使用flask-sqlalchemy來輔助創建 首先修改之前的init文件為: from flask i ...
  • 5.10自我總結 1.編碼解碼 1.字元串編碼 字元 》翻譯過程 》數字 2.字元串解碼 字元 》翻譯過程 》數字 3.編碼解碼用到的翻譯工具 中國:GBK 外國:日本—Shift_JIS,美國ASCII,南韓Euc kr 國際統一:Unicode進行編寫,存取用UTF 8,Unicode與UTF ...
  • 一個業務模塊,是負責完成一系列功能的,這些功能相互之間具有密切的關聯性,所以對於一個模塊來說,業務服務是一個整體,不應把他們再按單個實體拆分開來。OSharp 的業務模塊代碼結構設計,也是根據這一原則來設計的。設計規則如下 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...