C# static キーワード:静的変数、メソッド、クラスをマスターする
C# static キーワード
このガイドでは、C# の static キーワードについて、静的変数、メソッド、クラスを明確な実例で解説します。
C# でメンバーに static キーワードを適用すると、その型のすべてのオブジェクトで単一の共有インスタンスが作成されます。各インスタンスが独自のコピーを持つ代わりに、静的メンバーは型ごとに 1 つだけ存在します。
C# の静的変数
フィールドを static で宣言すると、オブジェクトを作成せずにクラス名で直接アクセスできます。
using System;
namespace StaticKeyword {
class Student {
// すべての学生で共有される静的変数
public static string department = "Computer Science";
}
class Program {
static void Main(string[] args) {
// クラス名で静的フィールドにアクセス
Console.WriteLine("Department: " + Student.department);
Console.ReadLine();
}
}
}
出力
Department: Computer Science
フィールド department はすべての Student インスタンスで共有されるため、Student.department として参照します。
静的変数 vs インスタンス変数
インスタンス変数は個々のオブジェクトに属し、それぞれ独自のコピーを持ちます。例:
class Student {
public string studentName;
}
class Program {
static void Main(string[] args) {
Student s1 = new Student();
Student s2 = new Student();
}
}
ここでは s1 と s2 は別々の studentName フィールドを持ちます。対照的に、静的フィールドはすべてのインスタンスで共通であり、オブジェクトを作成せずにアクセスできます。
例:静的変数とインスタンス変数
using System;
namespace StaticKeyword {
class Student {
public static string schoolName = "Programiz School"; // 共有
public string studentName; // 固有
}
class Program {
static void Main(string[] args) {
Student s1 = new Student();
s1.studentName = "Ram";
Console.WriteLine("Name: " + s1.studentName); // インスタンス
Console.WriteLine("School: " + Student.schoolName); // 静的
Student s2 = new Student();
s2.studentName = "Shyam";
Console.WriteLine("Name: " + s2.studentName);
Console.WriteLine("School: " + Student.schoolName);
Console.ReadLine();
}
}
}
出力
Name: Ram School: Programiz School Name: Shyam School: Programiz School
静的フィールド schoolName はすべての学生で同一であり、メモリ効率と論理的整合性を実現します。
C# の静的メソッド
静的メソッドはインスタンスではなくクラス自体で呼び出されます。他の静的メンバーのみにアクセスできます。
class Test {
public static void Display() {
// 実装
}
}
class Program {
static void Main(string[] args) {
Test.Display();
}
}
Test のすべてのオブジェクトが同じ Display メソッドを共有するため、クラス名で呼び出します。
例:静的メソッドと非静的メソッド
using System;
namespace StaticKeyword {
class Test {
public void Display1() {
Console.WriteLine("Non static method");
}
public static void Display2() {
Console.WriteLine("Static method");
}
}
class Program {
static void Main(string[] args) {
Test t1 = new Test();
t1.Display1(); // インスタンス呼び出し
Test.Display2(); // 静的呼び出し
Console.ReadLine();
}
}
}
出力
Non static method Static method
注意: Main メソッド自体が静的であるため、インスタンスなしで実行できます。
静的クラス
静的クラスはインスタンス化できず、静的メンバーのみを含められます。ヘルパーメソッドのグループ化に便利です。
using System;
namespace StaticKeyword {
static class Test {
static int a = 5;
static void Display() {
Console.WriteLine("Static method");
}
static void Main(string[] args) {
// Test t1 = new Test(); // ❌ コンパイルエラー
Console.WriteLine(a);
Display();
}
}
}
Test のインスタンス化を試みると CS0723 と CS0712 のコンパイルエラーが発生し、静的クラスであることが確認できます。
静的クラスは継承できません。例:
static class A { /* ... */ }
// class B : A { /* ... */ } // ❌ エラー
クラス内部での静的メンバーアクセス
同じクラス内では、静的フィールドとメソッドをクラス修飾子なしで直接参照できます。
using System;
namespace StaticKeyword {
class Test {
static int age = 25;
public static void Display() {
Console.WriteLine("Static method");
}
static void Main(string[] args) {
Console.WriteLine(age); // 直接アクセス
Display(); // 直接アクセス
Console.ReadLine();
}
}
}
出力
25 Static method
ここでは age と Display を Test. プレフィックスなしで使用しています。
C言語
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C# アクセス修飾子を理解する:public、private、protected、internal など
- C# this キーワードをマスターする
- C# 抽象クラスと抽象メソッドをマスターする:実践ガイド
- C# 入れ子クラスを理解する:定義、使用法、継承
- C# 部分クラスと部分メソッドを理解する
- C# sealed クラスとメソッドをマスターする:使用判断、実例、コードの安全性とパフォーマンス向上
- C++ポリモーフィズム完全理解:仮想関数と純粋仮想関数
- C++データ抽象化完全マスター:インターフェースと実装の分離
- C++データカプセル化:コードを守る仕組みと実装例
- Java static 完全解説:変数・メソッド・ブロックの実践例