分解宣言については、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でも実装されるでしょう)
まとめ
今までも、自分で拡張メソッドをつくれば分解できましたが、標準でも追加されましたね!