この章のテーマ §
classキーワードについて学びます。このキーワードは参照型を自作する最も基本的な方法です。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, 配列の基礎, string型, foreach文, new 演算子
解説 §
C#でプログラムを書くときは、intやstring等の型を使いますが、この型は自作できます。自作する方法は多くありますが、もっとも多く見るのはclassキーワードを使った参照型の自作です。
classキーワードで型を自作する最もシンプルな書式は、"アクセス修飾子 class 新しい名前 { 内容盛り沢山 }"です。アクセス修飾子は誰から利用を許すかで、publicは誰でも使えることを示します。名前は既存の名前と重複しない名前を自分で付けます。サンプルソースでは"Place"という名前を付けています。内容盛り沢山は、本当に多種多様なものを記述できます。メソッドなども記述できますが、ここではプロパティという機能だけを紹介しています。
プロパティは、クラス内にあるデータの入れ物を記述する方法の1つです。
基本的なシンプルな記述方法は、"アクセス修飾子 型名 プロパティ名 {get; set; }"です。get;とset;は、それぞれ【読み出し可能】【書き込み可能】を意味します。たとえばget;だけでset;がないプロパティは読み出し線用となります。
classキーワードで自作した型も、当然new演算子で実体化できます。
この時、クラスを実体化したものをインスタンスと呼びます。
クラスは設計図のようなもので、一つの名前に対して常に一つです。しかし、インスタンスはnew演算子を使うごとに増えていきます。1つのクラスに対応するインスタンスが100個、1000個ということも珍しくありません。プロパティで記録される情報はインスタンスごとに記録されるので、インスタンスが100個あれば一つのプロパティで記録できる情報も100個ということになります。
サンプルソースの場合、1つのNameプロパティで電気街、有明コロシアム、目黒天空庭園の3つを記録していますが、混乱することはありません。インスタンスが違うからです。
罠の数々 §
- クラス(class)は基本中の基本だが、他にも型を創り出す方法がある (structやrecordなど)
- ここで解説している機能は、本当にクラスの入口に過ぎない
- 読み出し専用のプロパティが成立するのは、初期化だけは許されていたり、値を生成するコードを記述することが許されているから
参考リンク §
クラスの概要
サンプルソース: kw_class §
var p = new Place[3];
p[0] = new Place();
p[0].Name = "電気街";
p[0].Station = "秋葉原駅";
p[1] = new Place();
p[1].Name = "有明コロシアム";
p[1].Station = "国際展示場駅";
p[2] = new Place();
p[2].Name = "目黒天空庭園";
p[2].Station = "池尻大橋駅";
foreach (var item in p) Console.WriteLine($"{item.Name}の最寄り駅は {item.Station}");
public class Place
{
public string? Name { get; set; }
public string? Station { get; set; }
}
実行結果 §
電気街の最寄り駅は 秋葉原駅
有明コロシアムの最寄り駅は 国際展示場駅
目黒天空庭園の最寄り駅は 池尻大橋駅
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
クラスXの宣言の中で自分自身(クラスX)を使うのはあり?
以下のクラス宣言はコンパイル可能?
class X
{
public X x { get; set; }
}
- なし! まだ定義が完了できていない型を参照するのは無理に決まってるだろ
- あり! 既に宣言が開始されているのだから、型を参照することはできるはず
[[解答]]