静的フィールドとメソッド
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 12/70。
これまで、私たちが作成したすべてのフィールドとメソッドは、個々のオブジェクトに属していました。しかし、すべてのインスタンスで共有される、クラス自体に属するデータや振る舞いが必要になることがあります。そこで static キーワードの出番です。
静的フィールドは、クラスのすべてのオブジェクトで共有されます。インスタンスをいくつ作成しても、コピーは1つしか存在しません:
public class Player
{
public static int TotalPlayers = 0;
public string Name { get; set; }
public Player(string name)
{
Name = name;
TotalPlayers++;
}
}新しい Player が作成されるたびに、TotalPlayers が増加します。すべてのプレイヤーがこの同じカウンターを共有します。
静的メソッドはクラスに属し、オブジェクトを作成せずに呼び出すことができます:
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
// インスタンスではなく、クラスに対して呼び出されます
int result = Calculator.Add(5, 3);静的メンバには、オブジェクト参照ではなくクラス名を使用してアクセスすることに注意してください。静的メソッドは特定のオブジェクトに属さないため、インスタンスフィールドにアクセスしたり、thisを使用したりすることはできません。
気づかないうちに、すでに静的メンバを使用しています。Console.WriteLine() は静的メソッドであり、Math.PI は静的フィールドです。
チャレンジ
簡単アプリケーション全体で行われたすべての注文を追跡するために、静的メンバーを使用する注文追跡システムを構築しましょう。
コードを整理するために2つのファイルを作成します:
Order.cs:OrderSystem名前空間内にOrderクラスを定義します。各注文は、インスタンスプロパティOrderId(int) とCustomerName(string) を持つ必要があります。また、このクラスは静的フィールドTotalOrdersを使用して作成された注文の総数を追跡し、次に利用可能な注文ID(1から開始)を返す静的メソッドGetNextOrderId()を提供する必要があります。コンストラクタは顧客名を受け取り、静的メソッドを使用して注文IDを自動的に割り当て、注文総数をインクリメントする必要があります。Program.cs: メインファイルで、入力に基づいて注文を作成し、その詳細と注文総数を表示します。
2つの別々の注文の顧客名を表す2つの入力を受け取ります。
各注文について、次の形式で詳細を出力してください:
Order #{OrderId} - Customer: {CustomerName}両方の注文を作成した後、総数を出力してください:
Total Orders: {TotalOrders}例えば、入力が Alice と Bob の場合、出力は次のようになります:
Order #1 - Customer: Alice
Order #2 - Customer: Bob
Total Orders: 2チートシート
static キーワードは、個々のインスタンスではなく、クラス自体に属するメンバを作成します。
静的フィールドは、クラスのすべてのオブジェクト間で共有されます。インスタンスがいくつ作成されても、コピーは1つだけ存在します。
public class Player
{
public static int TotalPlayers = 0;
public string Name { get; set; }
public Player(string name)
{
Name = name;
TotalPlayers++;
}
}静的メソッドはクラスに属し、オブジェクトを作成せずに呼び出すことができます。
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
// インスタンスではなく、クラスに対して呼び出されます
int result = Calculator.Add(5, 3);静的メンバは、オブジェクト参照ではなく、クラス名を使用してアクセスされます。静的メソッドは特定のオブジェクトに属していないため、インスタンスフィールドにアクセスしたり、this を使用したりすることはできません。
静的メンバの一般的な例には、Console.WriteLine()(静的メソッド)や Math.PI(静的フィールド)があります。
自分で試してみよう
using System;
using OrderSystem;
class Program
{
public static void Main(string[] args)
{
// 顧客名を読み込む
string customer1 = Console.ReadLine();
string customer2 = Console.ReadLine();
// TODO: 顧客名を使用して2つの Order オブジェクトを作成する
// TODO: 各注文の詳細を次の形式で出力する:
// Order #{OrderId} - Customer: {CustomerName}
// TODO: 合計注文数を次の形式で出力する:
// Total Orders: {TotalOrders}
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。