クラスのすべてのオブジェクトが変数を共有すると便利な状況は本当にありますか? もちろん、定数以外にも。
3 に答える
答えははいです。静的変数を使用し、クラスのすべてのインスタンスでこの変数を共有したい場合があります。
例
あなたが本のコレクションを持っているとしましょう。bookCount の静的フィールドを追加し、本の作成時にその値を増やすことで、本の数を追跡できます。
コード例については、@pcnThird の回答をご覧ください。
静的変数の私のお気に入りの使い方
静的フィールドは、定数フィールドとして動作する必要があるフィールドを使用したい場合に最も効果的ですが、コンパイル時にその値を知ることができません。
たとえば、ログ クラスがあるとします。このログ クラスのインスタンスを多数作成すると、すべてのインスタンスがファイル システムの異なる場所にログを記録します。
すべてのログ ファイルに日付を含む同じプレフィックスを付けたい場合は、日付が変更されるという厄介な習慣があるため、定数にすることはできません...解決策はstatic
フィールドになる可能性があります (私は通常static readonly
、コンストラクターがジョブを完了した後の定数)。
Public class Log
{
public static readonly string LogFilenamePrefix;
Public Static Log()
{
Log.LogFilenamePrefix = DateTime.Today.ToString()+"_MyLogFile";
}
}
この例では、DateTime クラスが Static 変数として使用していることもわかりToday
ます。これは、次の例につながります。
わかりやすい例
もちろん、静的変数を使用する以外に選択肢がない静的クラスの状況があります...
PS 静的変数は悪であると考える人もいます。このSO投稿を見てください。
次の例のように、静的変数を使用して、クラスのすべてのインスタンスで変数を共有できます。
class Program
{
static void Main(string[] args)
{
//Create new instances of the Employee class
Employee joe = new Employee("joe", 1);
Employee billy = new Employee("billy", 2);
Console.WriteLine(Employee.EmployeeCount);
Console.ReadKey();
}
}
class Employee
{
public string Name { get; set; }
public int ID { get; set; }
public static int EmployeeCount { get; set; }
public Employee(string n, int id)
{
this.ID = id;
this.Name = n;
EmployeeCount++;
}
}
静的変数とは対照的に、インスタンス変数を使用すると、各Employee
クラスが独自の変数Name
とID
変数を持つことができます。