C# 7.0 新特征1之基於Tuple的“多”前往值辦法。本站提示廣大學習愛好者:(C# 7.0 新特征1之基於Tuple的“多”前往值辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C# 7.0 新特征1之基於Tuple的“多”前往值辦法正文
原文鏈接:http://www.cnblogs.com/ylvict/p/5573094.html
回想
起首,提出一個成績,C#中,若何使一個辦法可前往"多個"前往值?
我們先往返顧一下C#6.0 及更早版本的做法。
在C#中,平日我們有以下4種方法使一個辦法前往多條數據。
•應用 KeyValue 組合
•
static void Main(string[] args) { int int1 = 15; int int2 = 25; var result = Add_Multiply(int1, int2); Console.WriteLine(result.Key); Console.WriteLine(result.Value); } private static KeyValuePair<int, int> Add_Multiply(int int1, int int2) { var KeyValuePair = new KeyValuePair<int, int>(int1 + int2, int1 * int2); return KeyValuePair; }
•應用 ref/out 參數
•Ref
•
static void Main(string[] args) { int int1 = 15; int int2 = 25; int add = 0; int multiply = 0; Add_Multiply(int1, int2, ref add, ref multiply); Console.WriteLine(add); Console.WriteLine(multiply); } private static void Add_Multiply(int int1, int int2, ref int add, ref int multiply) { add = int1 + int2; multiply = int1 * int2; }
•Out
•
static void Main(string[] args) { int int1 = 15; int int2 = 25; int add = 0; int multiply = 0; Add_Multiply(int1, int2, out add, out multiply); Console.WriteLine(add); Console.WriteLine(multiply); } private static void Add_Multiply(int int1, int int2, out int add, out int multiply) { add = int1 + int2; multiply = int1 * int2; }
•應用 struct 或許 class •struct
•
struct Result { public int add; public int multiply; } static void Main(string[] args) { int int1 = 53; int int2 = 17; var result = Add_Multiply(int1, int2); Console.WriteLine(result.add); Console.WriteLine(result.multiply); } private static Result Add_Multiply(int int1, int int2) { var result = new Result { add = int1 + int2, multiply = int1 * int2 }; return result; }
•class
•
class Result { public int add; public int multiply; } static void Main(string[] args) { int int1 = 13; int int2 = 27; var result = Add_Multiply(int1, int2); Console.WriteLine(result.add); Console.WriteLine(result.multiply); } private static Result Add_Multiply(int int1, int int2) { var result = new Result { add = int1 + int2, multiply = int1 * int2 }; return result; }
•dynamic
•
static void Main(string[] args) { int int1 = 13; int int2 = 27; var result = Add_Multiply(int1, int2); Console.WriteLine(result.add); Console.WriteLine(result.multiply); } private static dynamic Add_Multiply(int int1, int int2) { var result = new { add = int1 + int2, multiply = int1 * int2 }; return result; }
•應用 Tuple
•
static void Main(string[] args) { int int1 = 25; int int2 = 28; var result = Add_Multiply(int1, int2); Console.WriteLine(result.Item1); Console.WriteLine(result.Item2); } private static Tuple<int, int> Add_Multiply(int int1, int int2) { var tuple = new Tuple<int, int>(int1 + int2, int1 * int2); return tuple; }
Okay, 回想的空話有些多了。我們來看看C#7.0中的寫法
新特征(C#7.0)
老例子,先上代碼
static void Main(string[] args) { int int1 = 25; int int2 = 28; var result = Add_Multiply(int1, int2); Console.WriteLine($"Add: {result.add}, Multiply: {result.multiply}"); //(var add, var multiply) = Add_Multiply(int1, int2); //Console.WriteLine($"Add: {add}, Multiply: {multiply}"); } public (int add, int multiply) Add_Multiply(int int1, int int2) => (int1 + int2, int1 * int2);
怎樣樣?比起6.0及之前的C#,有無一種異常清新的感到。
其實只是基於Tuple 做了語法簡化的語法糖而已,只是給人一種多個前往值的錯覺。
總結:
這個特征固然不是何等振奮人心的變更,然則處理了之前許多碼農的一些癢點。
1. 看看KeyValue對的方法,原來很簡略的一個操作,寫出來的代碼會顯得異常的愚笨,取值的時刻又依據Key獲得。並且,最主要的是,假如不在運轉時,裡面挪用的代碼是不曉得有那些Key的。
2. 再說Ref/Out,這類方法應當是傳統意義上最風行的寫法了。乃至C#7.0的該特征,也沒法取消ref在必定情形下的性質。但至多在ref用於前往值這類情形下,代碼表現出的作風顯著是和現實邏輯不相符的,明明是前往值,卻要以參數的情勢進出,異常不公道。
3. struct和class的方法就不多說了,假如你針對的是一個實體,還能講得通,但假如自己目標是前往多個相干性不年夜的數據,專門為辦法間傳遞而加一個本沒有效處的Model類或構造,只能說是其時處理計劃下的無法。dynamic固然從表示情勢上沒有這類成績,然則存在更坑的成績是,除非在運轉時,不然內部挪用代碼基本不曉得辦法裡傳出來甚麼。
4. 說到傳統的Tuple,實際上是和該特征最接近的了,然則看看挪用時的*.Item1,*.Item2 。。天曉得都是何物。即便在完成辦法裡,也讓人面臨這類只見類型不見現實意義的值表現一頭霧水。
最初,說明一下,今朝(2016年6月)C#7.0還未正式宣布,年夜家假如想體驗部門特征,可以去下載VS15預覽版,終究宣布的語法能夠和本文中說起的有說分歧,最新靜態請年夜家存眷Roslyn項目。
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。