PR

[C#] 匿名クラス(匿名型)の使い方

スポンサーリンク

匿名クラスとは

匿名クラスは名前のないクラスです。

LINQのSelectメソッド内で複数の値を返すのに使用されます。
Selectメソッドで複数の項目を返すときにわざわざクラスを定義するのはめんどくさいということで生み出されました。

匿名クラスのメンバーはパブリックで読み取り専用なプロパティのみになります。
イミュータブル(Immutable:作成後は値を変更できない)なオブジェクトってやつです。

途中で値を変えたい場合、C#10(.NET6)からwith式を使って元のデータはそのままで、値をコピーしつつ指定されたプロパティを変更した匿名クラスを作成できるようになりました。詳しくは後述。

そんなことよりLINQのSelectメソッドを使ってみたいという方はこちらにどうぞ。

[C# LINQ] Selectメソッドで各要素から必要な項目を取り出す
LINQのSelectメソッドについての説明です。LINQってなに?という方は、 LINQってなに?LINQでできることを見てください。 Selectメソッドでできること LINQのSelectメソッドを使うと、配列・コレクションの各要素か...
スポンサーリンク

匿名クラスの使い方

匿名クラスは作るにはこんな感じに書きます。
new { } の中にプロパティ名 = 値 をカンマ区切りで指定します。

new { プロパティ名 = 値, プロパティ名 = 値, プロパティ名 = 値 }
using System;
class Program
{
    public static void Main()
    {
        // 匿名クラスを変数に代入
        var a = new { Name = "test", Value = 10 };

        // 匿名クラスのプロパティを表示
        Console.WriteLine($"Name={a.Name}, Value={a.Value}");
    }
}
Name=test, Value=10

匿名クラスを変数に入れるときは、型推論var で受け取ります。

また、プロパティ名を指定せず、値(変数、メンバー名など)だけを指定することができます。その場合、匿名クラスのプロパティ名は変数名、メンバー名と同じになります。

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    public static void Main()
    {
        // SampleDataクラスのリストの宣言と初期化
        List<SampleData> list = new List<SampleData> {
            new SampleData { Data1 = 1, Data2 = 10, Data3 = 100, Data4 = 1000 },
            new SampleData { Data1 = 2, Data2 = 20, Data3 = 200, Data4 = 2000 },
            new SampleData { Data1 = 3, Data2 = 30, Data3 = 300, Data4 = 3000 },
        };

        // LINQのSelectメソッド内で匿名クラスを使い必要な項目だけを返す
        var result = list.Select(sd => new { sd.Data1, sd.Data3 });

        // 結果を表示
        foreach (var sd in result) {
            Console.WriteLine($"Data1={sd.Data1}, Data3={sd.Data3}");
        }
    }
}

class SampleData
{
    public int Data1 { get; set; }
    public int Data2 { get; set; }
    public int Data3 { get; set; }
    public int Data4 { get; set; }
}

17行目のSelectメソッド内でプロパティData1、Data3を持った匿名クラスを返しています。

Data1=1, Data3=100
Data1=2, Data3=200
Data1=3, Data3=300

匿名型はプロパティの値を途中で変更できない(C#9までは)

最初に書きましたが匿名クラスのプロパティはオブジェクト生成時以外では値を変更することはできません。

using System;


class Program {
    public static void Main() {
        //匿名型のインスタンスを作成
        var anonymous = new { x = 10, y = 20 };
        //作成時以外は変更不可
        //anonymous.x = 100; //エラーになる
    }
}

途中で値を変更したい場合はタプル(tuple)を使うとできます。

class Program {
    public static void Main() {
        //タプルなら・・
        (int x, int y) tup = (10, 20);
        //途中で値を変更できる
        tup.x = 100;
    }
}

タプルについてはこちらの記事にまとめてあります。

[C# 入門] タプル(tuple)の使い方まとめ
今回はタプルについてです。 わりと新しめの機能で、データ型の1つになります。タプル型の変数は一つの変数に複数の値を格納できます。これを使うとメソッドの戻り値に複数の値を返せるようになったりします。 1つの変数で複数の値って配列もそうでは?と...
スポンサーリンク

with式で指定したプロパティを変更した匿名クラスを作成

C#10で登場したwith式を使うと匿名型のクローンを作ることができます。
使い方はこんな感じ、

using System;

namespace With_Test;
class Program
{
    static void Main(string[] args)
    {
        //匿名クラスを作成
        var data1 = new { Age = 10, Name = "Tarou" };

        //匿名クラスのクローンを作成
        var data2 = data1 with { };

        Console.WriteLine(data1);
        Console.WriteLine(data2);
    }
}
{ Age = 10, Name = Tarou }
{ Age = 10, Name = Tarou }

で、本題。with式の{ } ブロックの中で「プロパティ名 = 新しい値」とするとそのプロパティだけ書き換えることができます。複数のプロパティを書き換える場合はカンマで区切って指定します。

using System;

namespace With_Test;
class Program
{
    static void Main(string[] args)
    {
        //匿名クラスを作成
        var data1 = new { Age = 10, Name = "Tarou" };

        //匿名クラスのNameを書き換えてクローンを作成
        var data2 = data1 with { Name = "Hanako" };

        Console.WriteLine(data1);
        Console.WriteLine(data2);
    }
}
{ Age = 10, Name = Tarou }
{ Age = 10, Name = Hanako }

こんな感じでNameを書き換えた匿名クラスができました。


C# 記事まとめページに戻る(他のサンプルコードもこちら)

C# プログラミング講座
C#についての記事まとめページです。開発環境VisualStudioのインストール方法や使い方、プログラミングの基礎知識についてや用語説明の記事一覧になっています。講座の記事にはすぐに実行できるようにサンプルコードを載せています。

コメント