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