在某些情況下蜘腌,我們需要有多個(gè)返回值。舉個(gè)例子饵隙,比如某個(gè)函數(shù)提供的功能是查詢數(shù)組中的最大值和最小值逢捺。
通常我們會(huì)考慮把為返回值聲明一個(gè)結(jié)構(gòu)體,或者是把返回值通過out返回出去癞季。即:
// first way
struct MinMaxResult
{
public int Min { get; set; }
public int Max { get; set; }
}
MinMaxResult FindMinMax(int[] data);
// second way
void FindMinMax(int[] data, out int min, out int max);
對(duì)于某些很常用的、或者具有意義的結(jié)果倘潜,我們通常會(huì)用聲明結(jié)構(gòu)體绷柒。比如Point或者Rect。但對(duì)于某些使用范圍僅僅在一兩個(gè)文件的涮因,我們通常不去聲明一個(gè)結(jié)構(gòu)體废睦。這個(gè)時(shí)候我們可以使用Tuple。
Tuple<int, int> FindMinMax(int[] data);
// How to use it
var minMaxResult = FindMinMax(data);
int min = minMaxResult.Item1;
int max = minMaxResult.Item2;
可以看到养泡,代碼會(huì)更加的靈活嗜湃。但是同樣也導(dǎo)致了別的問題。我們使用的時(shí)候澜掩,Item1和Item2這種的名字沒有實(shí)際的意義购披,導(dǎo)致代碼可讀性變差。所以C#在后續(xù)的版本中進(jìn)行了改進(jìn)肩榕,我們可以寫成這樣:
(int min, int max) FindMinMax(int[] data);
// How to use it
var result = FindMinMax(data);
int min = result.min;
int max = result.max;
// Another way
int min, max;
(min, max) = FindMinMax(data);
// Or even shorter
(int min, int max) = FindMinMax(data);
// Or you just want max
(_, int max) = FindMinMax(data);
如果你沒有對(duì)Tuple起名字刚陡,默認(rèn)的名字依舊是Item1、Item2...
(int, int) FindMinMax(int[] data);
// How to use it
var result = FindMinMax(data);
int min = result.Item1;
int max = result.Item2;