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