DeconstructメソッドがKeyValuePair<TKey, Tvalue>などに追加されて、ValueTupleみたいに分解宣言できるようになる


分解宣言については、ufcppさんの複合型の分解がとてもわかりやすいので、そちらを参照してください。

さて、この分解ですがValueTuple型でなくてもDeconstructという名前のインスタンスメソッドか拡張メソッドを持っていれば使うことができます。

標準ライブラリの型にDeconstructという名前のインスタンスメソッド、もしくは拡張メソッドが加わり分解ができるようになりました。

(正確には、追加前から自前で拡張メソッドを作れば分解はできていたのですが、標準ライブラリに追加され自前で用意する必要がなくなりました。)

KeyValuePair<TKey, TValue>

  • .NET Standard 2.1~
  • .NET Core 2.0~
  • .NET Framework まだ(.NET Standard 2.1に入ったので、そのうち.NET Frameworkでも実装されるでしょう)

リファレンス

KeyValuePair<TKey, TValue>にもDeconstructという名前のインスタンスメソッドが追加されました。

これにより、以前はこう書いていたコードが、

Dictionary<string, int> dict = LoadDictionary();
foreach (var keyValuePair in dict)
{
    var key = keyValuePair.Key;
    var value = keyValuePair.Value;
    Console.WriteLine($"key: ${key}, value${value}");
}

こんな感じで書くことができます。

Dictionary<string, int> dict = LoadDictionary();
foreach ((string key, int value) in dict)
{
    Console.WriteLine($"key: ${key}, value${value}");
}

スッキリ!

各種Tuple

  • .NET Standard 2.0~
  • .NET Core 1.1~
  • .NET Framework 4.7~

リファレンス

Tuple<T1,T2>Tuple<T1,T2,T3>なのど各種Tupleクラス(ValueTuple構造体ではなく、Tupleクラス)には、TupleExtensionsクラスに拡張メソッドとしてDeconstructメソッドが定義されています。

ValueTupleと同じように、Tupleも分解ができます。

DictionaryEntry

非ジェネリックなSystem.Collections名前空間の型。使う機会は多くはないでしょうが、これにもDeconstructメソッドが追加されたようです。

  • .NET Standard 2.1~
  • .NET Core 2.0~
  • .NET Framework まだ(.NET Standard 2.1に入ったので、そのうち.NET Frameworkでも実装されるでしょう)

リファレンス

まとめ

今までも、自分で拡張メソッドをつくれば分解できましたが、標準でも追加されましたね!