2020年11月11日
川俣晶の縁側ソフトウェアC# コーディング How To total 1087 count

【入門級】C#9の目玉recordを使ってみる

Written By: 川俣 晶連絡先

 C#9の目玉recordを使ってみよう!

 recordは不変のクラスだ。

 一度作成すると値を変更することはできない。

 一般的に不変であることはプログラムの複雑さの爆発を防ぐ良い特徴であるとされている。一部のプログラミング言語は不変を貫徹し、そもそも変数が存在しないものもある。

 C#はそこまで行っていないものの、不変の扱いは強化された。

 たとえば、近所の自販機に缶コーヒーを買いに行くミッションの場合、缶コーヒーの名前と値段は変化してはならない情報だ。しかし、買う本数はリクエスト次第で増減するかもしれない。これは変化する情報だ。

 では、缶コーヒーの名前と値段を格納する形はどう定義すれば良いのか。

 recordを使うとpublic record ProductInfo(string Name, int Price);と書けば良い。

 これはrecordを使った多くの書式の一つだ。

 これで変化できないクラスProductInfoができあがる。

 それでも変化が必要な時はどうするか。

 With式で、メンバーの値を一部入れ換えた新しいオブジェクトを作成するのである。オブジェクトは変化しない。値を一部入れ換えた新しいオブジェクトが生まれるのである。

罠の数々 §

  • C#にrecordが追加されても依然として普通のクラスは定義できることに注意しよう。全部不変にしろとは言っていないのである。recordを使わないという選択肢もある。

参考リンク §

レコードの種類

with expression (C# reference)

 recordの書き方はいろいろある。様々なバリエーションを上記のリンクから確認しておこう。

リポジトリ §

https://github.com/autumn009/cshowto

record §

using System;

// recordの定義

public record ProductInfo(string Name, int Price);

class Program

{

    private static void dump(ProductInfo info)

    {

        Console.WriteLine($"{info.Name}: {info.Price}Yen");

    }

    static void Main()

    {

        // コーヒー120円です

        var info = new ProductInfo("Coffee", 120);

        dump(info);

        // 130円に値上げします

        var info2 = info with { Price = 130 };

        dump(info2);

    }

}

実行結果 (実行する環境で変化する)

Coffee: 120Yen

Coffee: 130Yen

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?