静的クラスは、オブジェクトをインスタンス化しない場合に使用されます。そのクラスの「インスタンス」を 1 つ取得します。次のようなことはできません。
MyStaticClass m = new MyStaticClass();
m.SomeFunc();
静的クラスを取得したとき。代わりに、クラス名自体を使用して使用します。何かのようなもの:
MyStaticClass.SomeFunc();
すべての Customer オブジェクトを追跡するために何を使用しますか? これらを保持するために、ある種のコレクションを使用できます。確かに、実際のシステムでは、データを保持するためのある種の永続化要素 (おそらくデータベース) が存在します。しかし、次のようなものを作ることができます:
IEnumerable<Customer> Customers = new List<Customer>();
そして、そのリストに顧客を追加します
Customers.Add(new Customer() { ... });
静的メソッドに関する質問に戻ります...
したがって、ここでの取り決めは、静的メソッドでインスタンス メンバーを参照しないということです。そのため、静的メソッドを使用して特定の顧客の住所を更新することはありません。Customer クラスが次のようになっていると仮定します。
public class Customer
{
public string Address { get; set; }
}
次のような静的メソッドを使用できませんでした
public static void SetAddress()
各顧客は (おそらく) 異なる住所を持っているためです。静的ではないため、顧客のアドレスにアクセスできませんでした。分かった?代わりに、インスタンス データを処理する必要のない何かを実行したい場合は、静的メソッドを使用します。ユーティリティ関数などには静的メソッドを使用します。
public static double ComputeSomething(double someVal) { ... }
ここで、ComputeSomething 関数は次のように誰でも呼び出すことができます。
var result = MyStaticClass.ComputeSomething(3.15);
ここで重要なのは、静的クラスはオブジェクトをインスタンス化するために使用されるのではなく、実際には関数を保持するための便利なコンテナーとして使用されるということです。静的関数は、非静的クラスに配置できる関数ですが、インスタンス データにはアクセスできません。
静的関数が使用される場所の 1 つは、Singleton パターンです。コンストラクターを非公開にして、人々がそれを呼び出せないようにし、代わりにクラスに静的メソッドを提供して、クラスの唯一のインスタンスを返します。何かのようなもの:
public class MySingleton
{
private static MySingleton instance;
private MySingleton() {}
public static MySingleton Instance
{
get
{
if (instance == null)
{
instance = new MySingleton();
}
return instance;
}
}
}