析构元组
var (name, address, city, zip) = contact.GetAddressInfo();
析构用户定义类型
通过实现一个或多个 Deconstruct
方法来析构该类型的实例
public void Deconstruct(out string fname, out string mname, out string lname)
使用扩展方法析构用户定义的类型
该方法返回 void,且要析构的每个值由方法签名中的 out 参数指示
public static void Deconstruct(this PropertyInfo p, out bool isStatic, out bool isReadOnly, out bool isIndexed, out Type propertyType) PropertyInfo prop = dateType.GetProperty("Now"); var (isStatic, isRO, isIndexed, propType) = prop;
推断元组元素名称
元组元素的名称可通过在初始化元组时使用的变量进行推断:
int count = 5; string label = "Colors used in the map"; var pair = (count, label); // element names are "count" and "label"
支持 ==
和 !=
两个元组具有相同数量的元素,且对于每个元组位置,可以使用 ==
和 !=
运算符对左右侧元组操作数中的相应元素进行比较
(int a, byte b) left = (5, 10); (long a, int b) right = (5, 10); Console.WriteLine(left == right); // output: True Console.WriteLine(left != right); // output: False var t1 = (A: 5, B: 10); var t2 = (B: 5, A: 10); Console.WriteLine(t1 == t2); // output: True Console.WriteLine(t1 != t2); // output: False
==
和 !=
操作不会考虑元组字段名称。
==
和 !=
运算符将以短路方式对元组进行比较。
在匿名类型和元组类型之间进行选择
“属性” | 访问修饰符 | 类型 | 自定义成员名称 | 析构支持 | 表达式树支持 |
---|---|---|---|---|---|
匿名类型 | internal |
class |
✔️ | ❌ | ✔️ |
Tuple | public |
class |
❌ | ❌ | ✔️ |
ValueTuple | public |
struct |
✔️ | ✔️ | ❌ |
在元组和匿名类型之间进行选择时,需要考虑几个因素。 一般来说,如果不使用表达式树,并且你熟悉元组语法,请选择 ValueTuple,因为它们提供可灵活命名属性的值类型。 如果使用表达式树并且想要命名属性,请选择匿名类型。
ValueTuple 类型是可变的,而 Tuple 是只读的。