C# 10個(gè)常用特性匯總
1) async / await
使用 async / await 模式,可以在執(zhí)行代碼塊操作的時(shí)候不會阻塞 UI 或者當(dāng)前的線程。即使該操作被某些執(zhí)行動作延遲了(比如一個(gè) web 請求),async / await 模式也會繼續(xù)執(zhí)行后續(xù)的代碼。
微軟文檔:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx
2) 對象 / 數(shù)組 / 集合的初始值設(shè)定項(xiàng)(initializers)
通過使用對象、數(shù)組、集合的初始值設(shè)定項(xiàng),可以很容易地創(chuàng)建類、數(shù)組和集合的實(shí)例:
// 示例類 public class Employee { public string Name {get; set;} public DateTime StartDate {get; set;} } // 使用初始值設(shè)定項(xiàng)創(chuàng)建員工實(shí)例 Employee emp = new Employee {Name="John Smith", StartDate=DateTime.Now()};
上述示例中的代碼在單元測試中可能非常有幫助,不過在有些情況下也應(yīng)該避免使用它,比如應(yīng)該通過構(gòu)造函數(shù)來進(jìn)行類的實(shí)例化的時(shí)候。
微軟文檔:https://msdn.microsoft.com/zh-cn/library/bb384062.aspx
3) Lambda 表達(dá)式、謂詞委托(predicates)、委托(delegates)和閉包(closures)
4) ?? – null 合并運(yùn)算符(Null coalescing operator)
當(dāng)表達(dá)式左側(cè)不為 null 的時(shí)候,?? 運(yùn)算符返回其左側(cè)的值,否則返回其右側(cè)的值:
// 可能是 null var someValue = service.GetValue(); var defaultValue = 23 // 如果 someValue 是 null 的話,result 為 23 var result = someValue ?? defaultValue;
?? 運(yùn)算符可以用于鏈?zhǔn)讲僮鳎?/p>
string anybody = parm1 ?? localDefault ?? globalDefault;
它也可以將可空類型轉(zhuǎn)換為非可空類型:
var totalPurchased = PurchaseQuantities.Sum(kvp => kvp.Value ?? 0);
文檔:https://msdn.microsoft.com/zh-cn/library/ms173224.aspx
5) $”{x}” – 內(nèi)插字符串(String Interpolation)- C# 6
C# 6 的一個(gè)新特性,可以通過更加高效和優(yōu)雅的方式來進(jìn)行字符串拼接:
// 傳統(tǒng)方式 var someString = String.Format("Some data: {0}, some more data: {1}", someVariable, someOtherVariable); // 新的方式 var someString = $"Some data: {someVariable}, some more data: {someOtherVariable}";
也可以在大括號中寫 C# 表達(dá)式,這讓它變得非常強(qiáng)大。
6) ?. – null 條件運(yùn)算符(Null-conditional operator) – C# 6
null 條件運(yùn)算符使用起來如下所示:
// 如果 customer 或 customer.profile 或 customer.profile.age 為 null 的話,結(jié)果都是 null var currentAge = customer?.profile?.age;
不再會發(fā)生 NullReferenceExceptions 了!
文檔:https://msdn.microsoft.com/zh-cn/library/dn986595.aspx
7) nameof 表達(dá)式 – C# 6
新的 nameof 表達(dá)式可能看上去沒那么重要,不過它確實(shí)也有其用武之地。在使用自動重構(gòu)工具(比如 Resharper)時(shí),你可能會需要通過參數(shù)的名字來表示它:
public void PrintUserName(User currentUser) { // 在重命名 currentUser 的時(shí)候,重構(gòu)工具可能會遺漏在文本中的這個(gè)變量名 if(currentUser == null) _logger.Error("Argument currentUser is not provided"); //... }
現(xiàn)在你可以這樣來寫:
public void PrintUserName(User currentUser) { // 重構(gòu)工具不會漏掉這個(gè) if(currentUser == null) _logger.Error($"Argument {nameof(currentUser)} is not provided"); //... }
文檔:https://msdn.microsoft.com/zh-cn/library/dn986596.aspx
8) 屬性初始值設(shè)定項(xiàng) – C# 6
你可以通過屬性初始值設(shè)定項(xiàng),在聲明一個(gè)屬性的時(shí)候指定一個(gè)初始值:
public class User { public Guid Id { get; } = Guid.NewGuid(); // ... }
使用屬性初始
使用屬性初始值設(shè)定項(xiàng)的一個(gè)好處,就是你不必聲明一個(gè) setter 方法,從而使得該屬性成為不可變的(immutable)。屬性初始值設(shè)定項(xiàng)可以和 C# 6 的主構(gòu)造函數(shù)(Primary Constructor)語法配合使用。(譯者注:Primary Constructor 語法可以讓你在定義一個(gè)類的同時(shí),在類名之后立即指定一個(gè)帶參數(shù)的構(gòu)造函數(shù))
9) as / is 運(yùn)算符
is 運(yùn)算符用來判斷一個(gè)實(shí)例是否是特定類型的,比如你想看一下類型轉(zhuǎn)換是否是可行的:
if (Person is Adult) { //do stuff }
as 運(yùn)算符會試圖將某個(gè)對象轉(zhuǎn)換為某個(gè)特定類的實(shí)例。如果無法轉(zhuǎn)換的話會返回 null:
SomeType y = x as SomeType; if (y != null) { //do stuff }
10) yield 關(guān)鍵字
你可以通過 yield 關(guān)鍵字來返回 IEnumerable 接口的數(shù)據(jù)項(xiàng)。下面的示例會返回 2 的次方(比如直到 8 次方:2、4、8、16、32、64、128、256):
public static IEnumerable<int> Power(int number, int exponent) { int result = 1; for (int i = 0; i < exponent; i++) { result = result * number; yield return result; } }
如果使用得當(dāng)?shù)脑?,yield 會變得非常強(qiáng)大。它使得你延遲生成序列中的對象,比如當(dāng)系統(tǒng)不需要枚舉整個(gè)集合的時(shí)候,可以按需停止。
以上就是C# 10個(gè)常用特性匯總的詳細(xì)內(nèi)容,更多關(guān)于C# 常用特性的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用代理模式來進(jìn)行C#設(shè)計(jì)模式開發(fā)的基礎(chǔ)教程
這篇文章主要介紹了使用代理模式來進(jìn)行C#設(shè)計(jì)模式開發(fā)的基礎(chǔ)教程,代理模式主張?jiān)诳蛻舳撕湍繕?biāo)對象中間建立中介來降低程序設(shè)計(jì)的耦合度,需要的朋友可以參考下2016-02-02C#操作EXCEL DataTable轉(zhuǎn)換的實(shí)例代碼
C#操作EXCEL DataTable轉(zhuǎn)換的實(shí)例代碼,需要的朋友可以參考一下2013-04-04