程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 7.0 新特征1之基於Tuple的“多”前往值辦法

C# 7.0 新特征1之基於Tuple的“多”前往值辦法

編輯:C#入門知識

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項目。

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved