【C#】タプルを使ってみる おまけで匿名型も

はいどーもおはようございますゲーム制作で日々が過ぎていく無職です。
本日はタプルを使ってみようと思いますよ。

タプルってなに

みなさんタプルってご存知でしょうか。
僕は名前だけは何度か聞いたことがあったのですが、実際に使ったことはほぼありません。
というのも、UnityはC#7に対応していなかったからです(タプルはC#7から)。
ですがそろそろUnityもC#7の時代だということで、ここは一つあらためて勉強しておこうというわけですね。
なお僕の認識は「戻り値を2つ以上返したいときref/outを使うことが多かったが、タプルで返せるようになって便利」くらいのもんです。

タプルの特徴

C#における一般的な型は「名前をベース」に区別されます。
これは「名前空間」なんてものを用意して、衝突しないようにする工夫が取られていることからもわかるかと思います。
ですがタプルは名前では区別をしません。
シグネチャで区別するというではありませんか。
この特徴を見る前に、まずはタプルの基本的な使い方を見てみたいと思います。
というわけでコードをドン。

最小サンプルですね。
戻り値が(int X, int Y)になっていることがわかるかと思います。
Mainメソッド内でタプルを作成し、それにアクセスしています。
point.Xでもpoint.Item1でも出力される結果は同じです。
今回はタプルの各値にXとYという名前をつけましたが、必ず名前をつけなければならない、ということではありません。
例えば以下のコードは有効です。

タプルは名前で区別していない

上記のコードからでも「タプルって名前いらないんだ」ということが薄っすらわかってきます。
ではここから「タプルが名前で区別するのではなく、シグネチャで区別している」ということを実際に見ていきたいと思います。
というわけでコードをドン。

これは完全に有効なコードです。
(int X, int Y)タプルを(int Width, int Height)タプルに代入しています。
上記のコードから、タプルはシグネチャが一致している場合は別の名前のタプルに変えることが可能、と言えます。

タプルはPublicフィールド

タプルが保持するそれぞれの値はPublicフィールドです。
つまり以下のように値を変更することができます。

Publicであることが不都合な場合も大いにあるかと思われますが、とにもかくにもタプルが保持する値は変更可能です。
これはきちんと認識しておかないと、思わぬ所でバグの原因となるかもしれませんね。

Publicが嫌な場合

どーしてもPublicであることが嫌な場合もあると思います。
そんなときは匿名型の利用を検討してみてもよいかもしれません。
例えば以下のような感じ。

匿名型が公開している値はプロパティであり、getアクセサのみPublicになっています。
したがって値を変更することはできません。
ただ匿名型をメソッド等の戻り値にする場合、ジェネリックを活用する必要があります。
例えば以下のような感じ。

これはタプルと違ってあんまり直感的な使い方ではない気がしますね。
僕は多用はしたくないかなあ……。
また、匿名型は「すでに同じ型が生成されていたなら、それを使い回す」ようです。
したがって以下のコードも有効です(こういう書き方もわかりにくい気がするので実際使うかどうかは謎ですが)。

終わりに

いかがでしたでしょーか。
僕はタプルと匿名型についてちょびっと理解が深まりました。
C#7.0対応のUnityに向けてこれからもチマチマ覚えていきたいと思いますよ。
あとUnityの新機能も興味あるんですけどね……。ちょっと難しそうでまだあんまり手が出ていません(特に英語の情報しかない場合だと心理的な壁が)。

ほなそんな感じでまた。

最後に、今回の記事で使ったコードのフルバージョンをペタリ。

フォローする