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

【入門級】不変のクラス、一部不変のクラス、可変のクラスを使い分ける

Written By: 川俣 晶連絡先

 C#には、(厳密には.NETには)、変更できるオブジェクトと変更できないオブジェクトと一部だけ変更できるオブジェクトがあります。変更できないオブジェクトは【不変のクラス】と分類されるクラスから作成されます。

 たとえば文字列は典型的な変更できないオブジェクトです。文字列型の変数は書き換えられますが、オブジェクトそのものは書き換えられません。たとえば文字列の中の1文字だけ書き換えることはできません。

 可変のオブジェクトの典型例はコレクションのListクラスです。要素数も要素の値も変更できます。

 しかし、一部だけ変更できるオブジェクトもあります。配列は要素の値は変更できますが要素の数は変更できません。それでは不便かと言えばそうでもありません。サイズを変えたければListクラスなどを最初から使ってしまえば良いからです。配列をList型に変更するのはToListメソッドですぐできます。

罠の数々 §

  • オブジェクトが不変であっても、変数はいくらでも書き換えられることに注意しよう
  • 変数も不変にしたい? それは定数という構文が別に存在する

参考リンク §

メンバー アクセス演算子と式 (C# リファレンス)

List<T> クラス

String クラス

Array クラス

 実は配列はArray クラスを経由して実現している。配列の機能を知りたければ、Array クラスを参照だ! しかも、Array クラスを直接使うといろいろ豊富な機能も知ることができる。上記のリンクから確かめてみよう。

リポジトリ §

https://github.com/autumn009/cshowto

Immutable §

using System;

using System.Collections.Generic;

class Program

{

    static void Main()

    {

        // 不変のオブジェクトの例

        var s1 = "hello!";

        // ↓書けない

        //s1[1] = 'H';

        Console.WriteLine(s1);

        // 可変のオブジェクトの例

        var list = new List<int>();

        list.Add(123);

        foreach (var item in list) Console.Write($"{item} ");

        Console.WriteLine();

        list[0] = 456;

        list.Add(789);

        foreach (var item in list) Console.Write($"{item} ");

        Console.WriteLine();

        // 一部可変のオブジェクトの例

        int[] array = { 123 };

        foreach (var item in array) Console.Write($"{item} ");

        Console.WriteLine();

        array[0] = 456;

        // ↓書けない

        //array.Add(789);

        foreach (var item in array) Console.Write($"{item} ");

        Console.WriteLine();

    }

}

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

hello!

123

456 789

123

456

COOL C# CREW

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

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