KeyValuePair <>结构中的Deconstruct方法的目的是什么?

时间:2018-08-12 14:45:52

标签: c# c#-7.0

我正在查看System.Collections.Generic.KeyValuePair<TKey, TValue>中的System.Runtime, Version=4.2.1.0结构,这种方法引起了我的注意。

这是签名:

public void Deconstruct(out TKey key, out TValue value);

除了转发KeyValue属性外,它是否还包含任何逻辑?为什么会有人比财产获取者更喜欢它?

2 个答案:

答案 0 :(得分:10)

解构是一项主要针对C#7中的值元组引入的功能,使您可以“在单个操作中将所有项目拆包成元组”。语法已被通用化,也可以用于其他类型。通过定义Deconstruct方法,您可以使用简洁的解构语法将内部值分配给各个变量:

var kvp = new KeyValuePair<int, string>(10, "John");
var (id, name) = kvp;

您甚至可以通过使用Deconstruct参数和out返回类型定义这样的void方法来对自己的用户定义类型应用解构方法,例如您的示例。参见Deconstructing user-defined types

答案 1 :(得分:2)

解构用于在C#中允许模式匹配(Scala中提供FP概念),这将分别产生键和值。同样也可以使用switch表达式。

KeyValuePairTest(new KeyValuePair<string, string>("Hello", "World"));
KeyValuePairTest(new KeyValuePair<int, int>(5,7));

private static void KeyValuePairTest<TKey, TValue>(KeyValuePair<TKey,TValue> keyValuePair)
{
    var (k, v) = keyValuePair;
    Console.WriteLine($"Key {k}, value is {v}");

    switch (keyValuePair)
    {
        case KeyValuePair<string, string> t:
            Console.WriteLine(t.Key + " " + t.Value);break;
        case KeyValuePair<int, int> t:
            Console.WriteLine(t.Key + t.Value); break;
    }
}