1. オブジェクトのフィールド:ここにオブジェクトのデータが入る
C#(てか、ほとんどのプログラミング言語)ではよく「すべてはオブジェクト」って言うよね。オブジェクトってのは、パソコンのメモリ上にある「仮想のモノ」で、何かを保存できる(データ)し、何かできる(メソッド)んだ。つまり、オブジェクトには状態(フィールド、データ)とふるまい(メソッド)があるってこと。
オブジェクトの例:
- ゲームのネコ(Cat)
- サイトのユーザー(User)
- 図書館の本(Book)
- 駐車場の車(Car)
オブジェクトを作るときは、クラス(テンプレート)のコピーを作る感じで、そのコピーは自分だけのデータを持てるんだ。
フィールドってのは、オブジェクトの「中にある」変数で、そのオブジェクトだけのデータを保存するためのもの。
リアルな例
ネコには名前、年齢、色があるよね。これらのデータは個別で、ネコごとに違うんだ。
public class Cat
{
public string Name; // ネコの名前 — オブジェクトのフィールド
public int Age; // ネコの年齢 — オブジェクトのフィールド
public string Color; // ネコの色 — オブジェクトのフィールド
}
オブジェクトを作るとき:
Cat cat1 = new Cat();
cat1.Name = "バーシク";
cat1.Age = 2;
cat1.Color = "グレー";
Cat cat2 = new Cat();
cat2.Name = "ムルカ";
cat2.Age = 5;
cat2.Color = "ブラック";
それぞれのオブジェクトは自分だけのフィールド値を持ってる!
| オブジェクト | Name | Age | Color |
|---|---|---|---|
| cat1 | バーシク | 2 | グレー |
| cat2 | ムルカ | 5 | ブラック |
フィールドは、オブジェクトの中にある「ポケット」みたいなもので、そこに何かを入れられるんだ。
2. オブジェクトのメソッド:オブジェクトができること
メソッドは、オブジェクトの「アクション」や「できること」や「関数」だよ。メソッドは、オブジェクトで「呼び出せる」コードのかたまり。
リアルな例
ネコにはアクションがあるよね:鳴く、走る、食べるとか。
public class Cat
{
public string Name;
public void Meow()
{
Console.WriteLine($"{Name} は言う: ニャー!");
}
public void Sleep()
{
Console.WriteLine($"{Name} は寝てる。");
}
}
使い方:
Cat cat1 = new Cat();
cat1.Name = "バーシク";
cat1.Meow(); // バーシク は言う: ニャー!
cat1.Sleep(); // バーシク は寝てる。
それぞれのオブジェクトは自分のメソッドを持ってて、そのメソッドは自分のフィールドを使う!
3. 静的フィールド(static fields):みんなで共有するデータ
たまに、フィールドにオブジェクトごとのデータじゃなくて、クラス全体で共有したい情報を入れたいときがあるよね。例えば、ネコが何匹作られたかカウントしたり、全ネコ共通の「最大音量」を設定したり。
そんなときはC#の静的フィールドを使う。これはstaticってキーワードで宣言するよ。
public class Cat
{
public string Name;
public static int Count = 0; // 静的フィールド
public Cat(string name)
{
Name = name;
Count++; // ネコの総数を増やす
}
}
//Catクラスの使い方
Cat c1 = new Cat("バーシク");
Cat c2 = new Cat("ムルカ");
Console.WriteLine(Cat.Count); // 2 — 全オブジェクト共通
静的フィールドはクラス全体で1つだけ、全オブジェクトで「共有」される。
アクセスするときはクラス名で書くのが普通:Cat.Count。
4. 静的メソッド(static methods)
静的メソッドは、特定のオブジェクトにひもづかず、クラス全体のものだよ。
- こういうメソッドはオブジェクトを作らなくても呼び出せる。
- 静的メソッドの中では普通(非static)のフィールドやメソッドにはアクセスできない — だって、どのオブジェクトか分からないから!
public class MathUtils
{
public static int Add(int a, int b)
{
return a + b;
}
}
使い方:
int sum = MathUtils.Add(2, 3); // 5
静的メソッドはよくユーティリティ — オブジェクトの状態に関係ない関数で使われるよ。
もうすでにたくさんの静的メソッドを使ってるはず:
Console.WriteLine();
Console.ReadLine();
Math.Round();
Math.Truncate();
5. メソッドとフィールドの比較
| 何これ? | どう宣言する? | どこに保存? | 何のため? | どうアクセス? |
|---|---|---|---|---|
| オブジェクトのフィールド | |
各オブジェクトごと | オブジェクトの個別データ | cat1.Name, cat2.Name |
| オブジェクトのメソッド | |
各オブジェクトごと | フィールドを使うアクション | cat1.Meow() |
| 静的フィールド | |
クラス全体で1つ | 全オブジェクト共通のデータ | Cat.C |
| 静的メソッド | |
クラス全体で1つ | オブジェクトに依存しない「できること」 | Cat.Method() |
7. イラスト
普通のフィールドとメソッド:
. +-----------------+
cat1: | Name = "バーシク" |
| Age = 2 |
+-----------------+
+------------------+
cat2: | Name = "ムルカ" |
| Age = 5 |
+------------------+
静的フィールド Count:
Cat.Count = 2 // 全ネコ共通の1つだけ
メソッドの呼び出し:
cat1.Meow(); // バーシク は言う: ニャー!
cat2.Meow(); // ムルカ は言う: ニャー!
静的メソッドの呼び出し:
MathUtils.Add(2, 3); // 5
まとめ
- フィールド — 各オブジェクトの個別の特徴(プロパティ)を担当。
- メソッド — オブジェクトができることを説明する。
- 静的フィールド — 「共通」データ(カウンターやグローバル設定など)を保存するのに向いてる。
- 静的メソッド — 特定のオブジェクトに依存しない操作(例えば数学関数)で使う。
8. よくある質問
静的フィールドにオブジェクト経由でアクセスできる?
技術的にはできる(cat1.Count)けど、クラス経由(Cat.Count)でアクセスするのが普通。混乱しないためにもね。
オブジェクトを作らずに非staticメソッドを呼べる?
無理!そういうメソッドは必ず特定のオブジェクトとそのデータを使うから。
静的メソッドの中で普通のフィールドやメソッドを使える?
無理!静的メソッドはどのオブジェクトか分からないから、アクセスできないよ。
「完全にstatic」なクラスって作れる?
できるよ。static classって書けばOK。そのクラスはnewで作れないし、メンバーは全部staticじゃないとダメ。
GO TO FULL VERSION