クラス、構造体、インターフェースにDeconstructメソッドを実装するとインスタンスを分解して複数の値にすることができます。
うん、よくわからないですね!とりあえずサンプルコードを見てください。
Deconstructメソッドを実装して分解してみる
こんな感じです。
using System;
class Sample
{
public int Property1 { get; set; }
public int Property2 { get; set; }
public string Property3 { get; set; }
// Deconstructメソッドの実装
public void Deconstruct(out int prop1, out int prop2, out string prop3)
{
prop1 = this.Property1;
prop2 = this.Property2;
prop3 = this.Property3;
}
}
class Program
{
public static void Main()
{
// クラスのインスタンスを作成
var cls = new Sample { Property1 = 10, Property2 = 20, Property3 = "abc" };
// クラスを分解してそれぞれの値を取り出す
var (value1, value2, value3) = cls;
// 取り出した値を表示
Console.WriteLine($"value1={value1}, value2={value2}, value3={value3}");
}
}
value1=10, value2=20, value3=abc
26行目が分解しているところです。分解した値を各変数に代入しています。
ここでSampleクラスのDeconstructメソッドが呼ばれます。
Deconstructメソッドの戻り値はvoid固定で、out引数で分解される値を返します。
いらない項目がある場合はアンダーバー「_」を使って破棄することができます。
var (value1, _, value3) = cls;
また、Deconstructメソッドは複数定義することができ、受け取る側の変数の数や型によって呼ばれるDeconstructが変わります。
using System;
class Sample
{
public int Property1 { get; set; }
public int Property2 { get; set; }
public string Property3 { get; set; }
// Deconstructメソッドの実装
public void Deconstruct(out int prop1, out int prop2)
{
prop1 = this.Property1;
prop2 = this.Property2;
}
public void Deconstruct(out int prop1, out int prop2, out string prop3)
{
prop1 = this.Property1;
prop2 = this.Property2;
prop3 = this.Property3;
}
}
class Program
{
public static void Main()
{
// クラスのインスタンスを作成
var cls = new Sample { Property1 = 10, Property2 = 20, Property3 = "abc" };
// クラスを分解して複数の値を取り出す
var (v1, v2) = cls;
var (value1, value2, value3) = cls;
}
}
リンク
リンク
C# 記事まとめページに戻る(他のサンプルコードもこちら)
C# プログラミング講座
C#についての記事まとめページです。開発環境VisualStudioのインストール方法や使い方、プログラミングの基礎知識についてや用語説明の記事一覧になっています。講座の記事にはすぐに実行できるようにサンプルコードを載せています。
コメント