クラス
クラス
クラス (class) は,フィールド (変数),メソッドなどのメンバを持つユーザ定義型です。
次のプログラムは,時計を表すクラス Clock を定義したものです。
using System;
// 時計を表すクラス
class Clock
{
// フィールド
public int Hour; // 時
public int Minute; // 分
// 時刻を表示するメソッド
public void PrintTime()
{
Console.WriteLine("{0:00}:{1:00}", Hour, Minute);
}
}
class Program
{
static void Main()
{
Clock clock1 = new Clock(); // インスタンス化
clock1.Hour = 6;
clock1.Minute = 30;
clock1.PrintTime();
Clock clock2 = new Clock();
clock2.Hour = 15;
clock2.Minute = 0;
clock2.PrintTime();
}
}
06:30
15:00
clock1, clock2 は時計の実例であるので,Clock クラスのインスタンス (instance) あるいはオブジェクト (object) と呼ばれます。
クラスのインスタンスを生成するには,new 演算子を用いてインスタンス化を行います。
Clock クラスのメンバは,2 つのフィールド (field) と 1 つのメソッド (method)。
フィールドは Hour と Minute であり,メソッドは PrintTime です。
クラスの外部からメンバにアクセスするには,ドット演算子を用いて clock1.Hour のように書きます。
クラスの内部からメンバにアクセスするには,単に Hour と書くか this.Hour のように書きます。
アクセス修飾子
キーワード public はアクセス修飾子と呼ばれ,メンバがクラスの外部からアクセス可能なことを意味します。
同一アセンブリ | 他のアセンブリ | |||
---|---|---|---|---|
派生クラス | クラス外部 | 派生クラス | クラス外部 | |
public | ○ | |||
private | × | |||
protected | ○ | × | ○ | × |
internal | ○ | × | ||
protected internal | ○ | × |
クラスのメンバには,これらすべての修飾子のいずれかが指定可能です。
アクセス修飾子を指定しないメンバは,デフォルトで private とされます。
クラスを始めとするユーザ定義型には,public または internal のいずれかが指定可能です。
アクセス修飾子を指定しないユーザ定義型は,デフォルトで internal とされます。
using System;
public class Class1
{
public int Field1;
private int Field2;
public void SetField2(int value)
{
Field2 = value;
}
}
internal class Program
{
static void Main()
{
Class1 c = new Class1();
c.Field1 = 5; // 可
c.Field2 = 5; // 不可
c.SetField2(5); // 可
}
}
フィールド
フィールドと局所変数は区別されます。
フィールド | 局所変数 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
宣言場所 | クラスのメンバとして宣言 | メソッド等の中で宣言 | ||||||||||
宣言場所の制約 | 変数の使用箇所より 前で宣言する必要はない | 変数の使用箇所より 前で宣言する必要がある | ||||||||||
初期化せずに 宣言したとき | 既定値で初期化される
| 未割り当てとなる |
静的メンバ
静的 (static) メンバとは,クラスをインスタンス化せずに利用できるメンバのことです。
using System;
class MathTools
{
// 静的メソッド
public static double Abs(double a)
{
return a < 0 ? -a : a;
}
public const double PI = 3.14 // const 定数
}
class Program
{
static void Main()
{
Console.WriteLine(MathTools.Abs(-5));
Console.WriteLine(MathTools.PI);
}
}
5
3.14159265358979
static 修飾子を付けたメンバは,静的メンバになります。
静的メンバにアクセスするには,クラス名.メンバ名 と書きます。
const 修飾子を付けたメンバは,定数かつ静的メンバになります。
読み取り専用フィールド
フィールドに readonly 修飾子を付けると,そのフィールドは読み取り専用になります。
読み取り専用フィールドへの書き込みは,コンストラクタからのみ可能です。
class Class1
{
readonly int field1; // 読み取り専用
public Class1(int a) { field1 = a; }
}
const 定数との違いは,値がコンパイル時に決定するか実行時に決定するかの違いです。