如果在一个方法中想返回多个返回值只能使用某些能打包数据的类型,例如数组。
但是数组做这个问题很大,第一你不能控制他的数量,数组是可以一个内容都没有的。
第二不能装多个类型,使用object的话那可能发生类型解析错误。
元组
元组打包少量固定数量固定类型的值。为什么是少量,因为这些类型全要手写出来。
元组类型
元组类型的声明方式为:括号(括号里写需要的类型,用逗号隔开)
元组类型的值同样是:括号(里面写对应类型的值,用逗号隔开)
(int, string)p = (13,"小王");
元组是有效的类型,可以作为方法的返回值,可以创建元组的数组,也可以把两个数组打包成元组。
使用元组的元素
元组内的元素可以使用Item+数字来点出来
就像数组的元素一样,他们可读可写,可以当作变量做变量能做的任何事。
命名元组元素
元组的元素可以自定义名字。
在给元素起名字后,原来的Item依然可用,但不会显示在自动补全中。
如果你起的名字是冲突的,那么冲突的名字会继续用默认的Item。
如果使用Item作为名字,那么除非跟它本来的名字是一样的。
定义类型时命名
在手动定义元组类型时,可以像声明变量一样顺便给他们起名字
(int age,string name)p=(13,"小王");
指定元组值时命名
如果定义元组类型时没有起名字(通常是因为使用了var自动判断类型),
可以在打包元组值时为值指明类型。语法为 名字+冒号+值
var p = (age: 13, name: "小王");
自动识别变量名
没有自己指定名字的时候元组还会尝试使用变量的名字来当作名字。
这种命名方法只能在用单个变量作为值的时候才有用。
使用常量,表达式,函数都不能生效。
析构元组
赋值时,如果值为元组,而被赋值的变量不是元组,而是一堆散开的类型,
那么不会创建元组,而是依次赋值。
int a = 10, b = 16;
(a, b) = (2,3);
Console.WriteLine(a);
Console.WriteLine(b);
析构声明
析构过程中可以声明变量。如果所有变量都要声明,可以只在外面写一个var
int a = 10;
(a, int b) = (2, 3);
var (c, d) = (a, b);
弃元
有时你不会用到元组里的所有值,可以使用下划线表示无需赋值此元素
var (a, b) = (2, 3);
var (_, d) = (a, b);
(a, _) = (6,8);
重写的方法
比较
元组是值类型。在赋值时会赋值所有内容。不会像数组一样窜号。
同样的,在使用==和!=判断时,也会一一比较所有的内容是否相同。
排序
只有定义了排序方法的类型才能在数组的Sort方法中生效。
而元组定义了,而且会按顺序比较所有内容的顺序。
在第一个顺序不相同的内容出现时,整个元组都会按照这个顺序排序。
转字符串
元组转字符串会输出所有的内容。