C# 中 10 個你真的應該學習(和使用!)的功能

傳智黑馬發表於2019-11-04

本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

如果你開始探索C#或決定擴充套件你的知識,那麼你應該學習這些有用的語言功能,這樣做有助於簡化程式碼,避免錯誤,節省大量的時間。

1)async / await

使用async / await-pattern允許在執行阻塞操作時解除UI /當前執行緒的阻塞。async / await-pattern的工作原理是讓程式碼繼續執行,即使在某些東西阻塞了執行(如Web請求)的情況下。

閱讀更多有關async / await-pattern的資訊,請訪問:https://msdn.microsoft.com/en-us/library/hh191443.aspx<wbr><wbr><wbr><wbr>

2)物件/陣列/集合初始化器

通過使用物件、陣列和集合初始化器,可以輕鬆地建立類、陣列和集合的例項:

//一些演示類
public class Employee {
    public string Name {get; set;}
    public DateTime StartDate {get; set;}
}

//使用初始化器建立employee 
Employee emp = new Employee {Name="John Smith", StartDate=DateTime.Now()};

上面的例子在單元測試中才真正有用,但在其他上下文中應該避免,因為類的例項應該使用建構函式建立。

閱讀更多有關初始化器的資訊,請訪問:https://msdn.microsoft.com/en-us/library/bb384062.aspx<wbr><wbr><wbr><wbr>

3)Lambdas,謂詞,delegates和閉包

在許多情況下(例如使用Linq時),這些功能實際上是必需的,確保學習何時以及如何使用它們。

閱讀更多關於Lambdas,謂詞,delegates和閉包的資訊,請訪問:http://www.codeaddiction.net/articles/13/lambda-expressions-delegates-predicates-and-closures-in-c<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

4)??(空合併運算子)

?? – 運算子返回左側,只要它不為null;那樣的情況下返回右側:

//可能為null
var someValue = service.GetValue();
var defaultValue = 23

//如果someValue為null,結果將為23
var result = someValue ?? defaultValue;

?? – 運算子可以連結:

string anybody = parm1 ?? localDefault ?? globalDefault;

並且它可以用於將可空型別轉換為不可空:

var totalPurchased = PurchaseQuantities.Sum(kvp => kvp.Value ?? 0);

閱讀更多有關?? – 運算子的資訊,請訪問:https://msdn.microsoft.com/en-us/library/ms173224.aspx<wbr><wbr><wbr><wbr>

5)$“{x}”(字串插值) ——C#6

這是C#6的一個新功能,可以讓你用高效和優雅的方式組裝字串:

//舊方法
var someString = String.Format("Some data: {0}, some more data: {1}", someVariable, someOtherVariable);

//新方法
var someString = $"Some data: {someVariable}, some more data: {someOtherVariable}";

你可以把C#表示式放在花括號之間,這使得此字串插值非常強大。

6)?.(Null條件運算子) ——C#6

null條件運算子的工作方式如下:

//Null if customer or customer.profile or customer.profile.age is null
var currentAge = customer?.profile?.age;

沒有更多NullReferenceExceptions!

閱讀更多有關?.-運算子的資訊,請訪問:https://msdn.microsoft.com/en-us/library/dn986595.aspx

7)nameof Expression ——C#6

新出來的nameof-expression可能看起來不重要,但它真的有它的價值。當使用自動重構因子工具(如ReSharper)時,你有時需要通過名稱引用方法引數:

public void PrintUserName(User currentUser)
{
    //The refactoring tool might miss the textual reference to current user 
    below if we're renaming it
    if(currentUser == null)
        _logger.Error("Argument currentUser is not provided");

    //...
}

你應該這樣使用它…

public void PrintUserName(User currentUser)
{
    //The refactoring tool will not miss this...
    if(currentUser == null)
        _logger.Error($"Argument {nameof(currentUser)} is not provided");

    //...
}

閱讀更多有關nameof-expression的資訊,請訪問:https://msdn.microsoft.com/en-us/library/dn986596.aspx<wbr><wbr><wbr><wbr>

8)屬性初始化器 ——C#6

屬性初始化器允許你宣告屬性的初始值:

public class User
{ 
    public Guid Id { get; } = Guid.NewGuid();
    // ...
}

使用屬性初始化器的一個好處是你不能宣告一個集合:嗯,因此使得屬性不可變。屬性初始化器與C#6主要建構函式語法一起工作。

9)as和is 運算子

is 運算子用於控制例項是否是特定型別,例如,如果你想看看是否可能轉換:

if (Person is Adult)
{
    //do stuff
}

使用as運算子嘗試將例項轉換為類。如果不能轉換,它將返回null:

SomeType y = x as SomeType;
if (y != null)
{
    //do stuff
}

10)yield 關鍵字

yield 關鍵字允許提供帶有條目的IEnumerable介面。 以下示例將返回每個2的冪,冪指數從2到8(例如,2,4,8,16,32,64,128,256):

public static IEnumerable Power(int number, int exponent)
{
    int result = 1;
    for (int i = 0; i < exponent; i++)
    {
      result = result * number;
      yield return result;
    }
}

yield返回可以非常強大,如果它用於正確方式的話。 它使你能夠懶惰地生成一系列物件,即,系統不必列舉整個集合——它就會按需完成。

譯文連結:http://www.codeceo.com/article/10-features-csharp-need-learn.html
英文原文:10 features in C# that you really should learn (and use!)
翻譯作者:碼農網 – 小峰
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章