值得推薦的C#不同版本語言特性

C#語言在不斷地版本升級中,為我們提供了很多新的語言特性。其中,有很多使用的語言特性,我覺得在實際開發中用起來很方便,能夠簡化我們的程式碼,增強可讀性,提高開發效率。

小編不才,在這裡給大家整理了一些實際開發中用起來感覺不錯的C#語言特性。

C# 3.0
1.類型推斷 var
在申明變數的時候,我們可以不用指定類型,var類型會幫我們自動推斷出變數類型。簡化了變數聲明

var num = 1;
var str = "hello";

效果等同於:

int num = 1;
string str = "hello";

注意點:var類型變數不支援賦值為NULL

2.擴展方法

擴展方法必須定義在靜態類中,通常用this關鍵字修飾方法參數(this代表當前調用對象)

    public static class StringStatic
    {
        /// <summary>
        /// 獲取首字母
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public static string StringToFirst(this string s)
        {
            if (string.IsNullOrEmpty(s))
                return "";
            else
                return s.Substring(0, 1);
        }
    }

如上:為string類型的對象添加了獲取首字母的擴展類型。

調用:

var str = "hello";
var strFirst = str.StringToFirst();//strFirst="h"

3.lambda表達式

通過lambda表達式,我們可以以一種更為簡潔的方式編寫函數處理程式碼,它形同於一個計算表達式,使用 Lambda運算符=>,該運算符讀為「goes to」。

語法:

(input parameters) => {
   /*Your statement goes here*/
}

=>運算符左側為輸入參數或者無參數,運算符右側為表達式體或者語句塊,如果是語句塊用{}包含。

在LINQ查詢中,我們經常使用,比如:

lambda表達式:

//定義list
var list = new List<string>() { "a", "b", "c" };
//使用lambda表達式條件篩選
var str = list.Where(x => x == "a").FirstOrDefault();

lambda語句塊:

//定義list
var list = new List<string>() { "a", "b", "c" };
//lambda語句塊
list.ForEach(x =>
{
     Console.WriteLine(x);
});

lambda表達式在實際開發中已經應用的比較廣泛了,程式碼簡潔,開發效率高。給個五星好評,哈哈

C# 4.0
1.元組Tuple

元組可以當成是一個存儲多個不同數據類型數據的的集合。當有多個(不同類型)數據臨時存儲或者作為方法返回值返回時,List和Dictionary已不能滿足需求,這個時候我們又不想單獨創建一個實體類用來管理集合,那麼Tuple可以成為我們不錯的選擇。

格式:

Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>

Tuple提供了8個成員,默認情況下1-7成員支援直接使用,每個成員可以是不同數據類型,如果成員有8個或者多於8個時可以通過擴展第8個成員的方式,增加成員數量。

比如:

Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T1,T2,...,TRest>>

創建元組

方式1:new

var tuple1 = new Tuple<int, string, string, string, string, string, string, Tuple<string,string>>(1, "2", "3", "4", "5", "6", "7", new Tuple<string, string>("8","9"));

方式2:Create

var tuple2 =Tuple.Create<int, string, string, string, string, string, string, string>(1, "2","3", "4", "5", "6", "7", "8");

註:這裡第8個元素,雖然我們創建的是string類型,實際獲取到類型是Tuple<string>,效果等同於:

var tuple2 =Tuple.Create<int, string, string, string, string, string, string, Tuple<string>>(1, "2","3", "4", "5", "6", "7", new Tuple<string>("8"));

元組成員調用

tuple1.Item1
tuple1.Item2
...
tuple1.Item7 tuple1.Rest

通過如上方式,分別獲取第1-8成員。實際場景中需要我們使用的時候記住成員的位置。

元組在實際開發中場景應用起來比較方便,不需要我們額外的通過實體進行集合管理。通常用於方法有多個數據返回值的場景。

C# 5.0
1.非同步編程(async和await)

在越來越多高並發,高性能的應用場景需求下,非同步編程在一定程度上成為解決問題的一個突破口,現在.net core框架已經推薦使用Task+async+await進行非同步編程,足以見得它的魅力所在。

之前我專門有個文章講解過async+await非同步編程,感興趣的同學可以了解下,這裡就不展開說了。
C# 6.0
1.NULL條件運算符(?.)

運算符”?.”用於判斷一個對象是否為空。

比如:

Object?.Tostring() 

Object對象如果不為空,則執行Tostring()方法並返回值;

Object對象如果為空,則直接返回NULL

運算符”?.”簡化了我們的判空操作,避免了Object為空時使用ToString()報錯,效果等同於:

if (Object == null)
        return null;
else
        return Object.ToString();

2.空合併運算符(??)

語法格式如下:

string str = "adc";
var result = str ?? str.ToUpper();

如果??運算符左側操作數str結果為NULL,則返回??運算符右側操作數。

如果??運算符左側操作數str結果不為NULL,則返回??運算符左側操作數。

(通俗點就是,左側不為空就返回左側數據,為空就返回右側數據)

3.字元串拼接($)

回想一下我們比較常用的字元串拼接方式。

//+運算符 拼接
string str2 = str1 + "你好";
//字元串格式化拼接
string str3 = string.Format(@"{0},你好", str1);

+運算符連接的方式,每+一次都會生成一個新的string對象,佔用記憶體;

Format字元串格式化,佔位符順序需謹慎;

而C#6.0給我們帶來了新的字元串拼接特性,格式如下:

string str4 = $"{str1},你好";

$操作符標記雙引號「」中的字元串;其中,中括弧{}可用於動態取值。這種形式更為簡單且從語法上也更易被接受。

4.lambda表達升級使用

lambda表達式作為函數體,形如:

        /// <summary>
        /// 沒有返回值函數
        /// </summary>
        public void ConsoleLog() => Console.WriteLine("沒有返回值函數");
        /// <summary>
        /// 一個簡單的有返回值函數
        /// </summary>
        /// <param name="StudentId"></param>
        /// <param name="StandardName"></param>
        /// <returns></returns>
        public Student GetStudent(int StudentId, string StandardName) => new Student { StandardId = StudentId, StudentName = StandardName };

lambda表達式直接作為函數體,這樣程式碼更為高效簡潔。

lambda表達式用作屬性

public string TimeString => DateTime.Now.ToString("yyyyMMdd");

同樣的方式,lambda表達式用作屬性賦值也比較簡單。

C# 7.0
1.out類型參數

C#7.0版本之前,我們使用out引用類型作為輸出參數,必須要先申明,才能使用。如下:

int intValue = 0;
int.TryParse("100", out intValue);

有時候我可能並不關注這個out輸出參數,但是確不得不聲明一個變數存儲它,煩躁。。。幸運的是7.0為我帶來了一絲曙光。

我們可以「使用時內聯聲明」,無需提前單獨聲明:

int.TryParse("100", out int intValue);

這樣是不是感覺一身輕鬆ღ( ´・ᴗ・` )

2.ValueTuple元組

C#4.0的時候新增了特性元組Tuple,但是用過的同學會覺得有些不足:

   1)Tuple 成員的可讀性差,只能通過Item1,Item2..坐標式的方式讀取成員 。

   2)Tuple 是引用類型,大量頻繁的使用占記憶體。

於是C#7.0馬上推出了ValueTuple類型元組,很顯然它解決了上述兩種不足。

   1)ValueTuple 支援用名稱定義成員。

   2)ValueTuple 是值類型。

我們先來看看如何使用ValueTuple

創建的簡單ValueTuple

            // 語法糖創建元組
            var tuple1 = (1, 2);
            // Create創建元組
            var tuple2 = ValueTuple.Create(1, 2);
            // new 運算符創建元組
            var tuple3 = new ValueTuple<int, int>(1, 2);

調用成員:這種方式和Tuple的使用基本一樣,調用成員也是通過item1,item2…的方式。

創建的指定名稱的ValueTuple

            // 左邊指定欄位名稱
            (int first, int second) tuple1 = (1, 2);
            // 右邊指定欄位名稱
            var tuple2 = (first: 1, second: 2);

調用成員:可通過定義的成員名稱獲取,tuple1.first  / tuple1.second,可讀性更高。

C#8.0

1.NULL合併並賦值(??=)

C# 8.0 引入了 null 合併賦值運算符??=,是C#6.0中的空合併運算符(??)的升級

當左操作數計算為 null 時,才能使用運算符 ??= 將其右操作數的值分配給左操作數。

List<int> numbers = null;
int? i = null;

numbers ??= new List<int>();
numbers.Add(i ??= 17);
numbers.Add(i ??= 20);

Console.WriteLine(string.Join(" ", numbers));  // output: 17 17
Console.WriteLine(i);  // output: 17

 

Tags: