winform入門教程,C# 10 的五大新功能

 2023-10-22 阅读 30 评论 0

摘要:作者 | Matthew MacDonald? ? ? ?譯者 | 彎月? ? ?責編 | 歐陽姝黎出品 | CSDN(ID:CSDNnews)以下為譯文:C# 的 GitHub 頁面上記載了一長串誘人的想法,其中一些令人頭疼的問題仍在討論中。如果你想知道C# 10中究竟包含了哪些新功能,

作者 | Matthew MacDonald? ? ? ?

譯者 | 彎月? ? ?責編 | 歐陽姝黎

出品 | CSDN(ID:CSDNnews)

以下為譯文:

C# 的 GitHub 頁面上記載了一長串誘人的想法,其中一些令人頭疼的問題仍在討論中。如果你想知道C# 10中究竟包含了哪些新功能,可以等待11 月新版本的發布。或者,你也可以關注 C# 團隊展示的他們最喜歡的功能。在最近的微軟Build 大會上,C# 的首席設計師 Mads Torgersen 透漏了一些目前正在進行的工作。以下是該語言的下一個版本將會提供的五大新功能。

global using

C# 的源代碼文件開頭一般都會導入一堆命名空間。下面是一個普通的ASP.NET Web 應用程序的代碼片段:

using LoggingTestApp.Data;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LoggingTestApp
{
public class Startup{...}
}

這段代碼的寫法沒有什么特別之處。以前,命名空間的導入可以讓我們快速了解某個類正在使用哪些庫。然而如今,這只不過是一堆不得不寫又沒人去看的代碼了。

winform入門教程、C# 10 引入了一種新模式,允許你使用關鍵字 global 定義整個項目的命名空間導入。推薦做法是,將全局導入放在一個單獨的文件中(每個項目一個),可以命名為 usings.cs 或imports.cs。其中的內容大致為:

global using Microsoft.AspNetCore.Builder;
global using Microsoft.AspNetCore.Hosting;
global using Microsoft.AspNetCore.HttpsPolicy;
global using Microsoft.AspNetCore.Identity;
global using Microsoft.AspNetCore.Identity.UI;
global using Microsoft.EntityFrameworkCore;
global using Microsoft.Extensions.Configuration;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Hosting;
global using System;
global using System.Collections.Generic;
global using System.Linq;
global?using?System.Threading.Tasks;

然后就可以簡化原來的文件了:

using LoggingTestApp.Data;
using Serilog;
namespace LoggingTestApp
{
public class Startup{...}
}

Visual Studio會突出顯示重復的命名空間(即同時在全局文件和本地文件中導入的命名空間)。盡管這不是錯誤,但刪除重復的命名空間可以減少代碼量,并將注意力集中在特定文件正在使用的特殊命名空間上。

文件范圍的命名空間

C# 10 提供了另一種簡化代碼的方法:聲明文件范圍的命名空間。文件范圍的命名空間會自動應用于整個文件,而且無需縮進。

換句話說,下面這種寫法:

namespace LoggingTestApp
{
public class Startup{...}
}

winform是什么語言。可以變成:

namespace LoggingTestApp;
public class Startup
{...
}

如果在使用了文件范圍命名空間的文件中,再添加一個命名空間塊,則會創建一個嵌套命名空間:

namespace Company.Product;
// This block creates the namespace Company.Product.Component
namespace Component
{
}

C# 設計者認為這個改動可以清理水平空間的浪費(就像global using清理了垂直空間的浪費一樣)。總體目標是讓代碼更短、更窄、更簡潔。但這些變化也可以降低新手學習C#的難度。結合global using與文件范圍的命名空間,只需幾行代碼就可以創建出一個Hello World 控制臺應用程序。

空參數檢查

本著減少樣板代碼的精神,C# 提供了一個非常好的新功能:空參數檢查。你肯定編寫過需要檢查空值的方法。比如,如下代碼:

public UpdateAddress(int personId, Address newAddress)
{
if (newAddress == null){
throw new ArgumentNullException("newAddress");}...
}

如今,你只需要在參數名稱末尾添加“!!”,C#就會自動加入這種空參數檢查。上述代碼可以簡化為:

public UpdateAddress(int personId, Address newAddress!!)
{...
}

蘋果11有什么新功能?現在,如果傳遞一個空值給 Address,就會自動拋出 ArgumentNullException。

這種細節可能看似微不足道,但實際上這是非常簡單又很有價值的優化語言的方式。大量研究表明,導致程序出錯的原因往往是由于非常容易避免的錯誤反復發生,不是因為代碼中的概念太復雜,而是因為閱讀代碼很累,而人類的注意力有限。減少代碼量可以減少審查代碼所需的時間,處理代碼所需的認知負荷,以及由于注意力減弱而忽略某些錯誤的可能性。

required 屬性

以前,我們只能通過類構造函數來確保正確地創建對象。如今,我們經常使用更加輕量級的結構,比如下面這個記錄中自動實現的屬性:

public record Employee
{public string Name { get; init; }public decimal YearlySalary { get; init; }public DateTime HiredDate{ get; init; }
}

在創建這類輕量級對象的實例時,我們可能會使用對象的初始化語法:

var theNewGuy = new Employee
{Name = "Dave Bowman",YearlySalary = 100000m,HiredDate = DateTime.Now()
};

但是,如果你的對象中的某些屬性是必須的,該怎么辦?你可以像以前一樣,添加一個構造函數,但如此一來就需要添加更多的樣板代碼了。此外,將值從一個參數復制到屬性也是另一個很容易理解但很常見的錯誤。

winform界面控件、C# 10 引入的關鍵字 required 可以消滅這類問題:

public record Employee
{public required string Name { get; init; }public decimal YearlySalary { get; init; }public DateTime HiredDate{ get; init; }
}

如此一來,如果不設置 Name 屬性就無法創建 Employee 了。

關鍵字field

多年來,為了通過自動實現屬性簡化代碼,C# 團隊做出了大量努力,上面的 Employee 記錄就是一個很好的例子,它使用 get 和 init 關鍵字聲明了三個不可變的屬性。數據存儲在三個私有字段中,但這些字段都是自動創建的,無需人工干預。而且你永遠不會看到這些字段。

自動實現的屬性很棒,但它們的作用也僅限于此。當無法使用自動實現的屬性時,你就必須添加支持字段到類,并編寫正常的屬性方法,就像回到 C# 2一樣。但是 C# 10中提供了一個關鍵字field,可以自動創建支持字段。

例如,假設你想創建一個記錄,用于處理初始屬性值。在下面的代碼中,我們對 Employee 類進行了一些修改,確保HiredDate 字段只包含來自 DateTime 對象的日期信息(不包含時間信息):

public record Employee
{public required string Name { get; init; }public decimal YearlySalary { get; init; }public DateTime HiredDate{ get; init => field = value.Date(); }
}

winform自定義控件開發?這段代碼非常整潔、簡單,而且很接近聲明式。

你可以使用關鍵字 field 訪問 get、set 或 init 中的字段。而且,你可能需要驗證某個屬性,就像驗證普通類中的屬性一樣:

private string _firstName;
public string FirstName
{get{return _firstName;}set{if (value.Trim() == "")throw new ArgumentException("No blank strings");_firstName = value;}
}

你可以使用 field 來驗證自動實現的屬性:

public string FirstName {get;set{if (value.Trim() == "")throw new ArgumentException("No blank strings");field = value;}
}

本質上,只要不需要修改屬性的數據類型,就不需要自行聲明支持字段。

總結

當然,C# 10中的新功能肯定不止這個五個。還有一些表達式方面的變化,以及一個有爭議的變動:在接口中定義靜態成員。我們只有耐心等待了。

winform窗體。總體來看,C# 10 的發展重點很明確,即減少代碼量,提供更多便利性,減輕開發人員的負擔。

原文鏈接:https://medium.com/young-coder/a-closer-look-at-5-new-features-in-c-10-f99738b0158e

聲明:本文由CSDN翻譯,轉載請注明來源。

?
?因一個 Bug,谷歌、GitHub、亞馬遜等網站全球大范圍宕機!
?減少 JavaScript 代碼量的原生技術
?蘋果造車欲用中國電池,前提是在美國建廠?比亞迪、寧德時代正與其談判

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/159560.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息