静的クラスに対する非静的クラスの利点は何ですか?
静的クラスをインスタンス化する必要はありません。直接使用できるClassName.MemberName
ので、非静的クラスの使用はどうなりますか
静的クラスは基本的に非静的クラスと同じですが、1つの違いがあります。静的クラスはインスタンス化できません。つまり、newキーワードを使用して、クラスタイプの変数を作成することはできません。インスタンス変数がないため、クラス名自体を使用して静的クラスのメンバーにアクセスします
静的クラスにはクラス自体のインスタンスが1つしかないため、静的クラスの複数のインスタンスを作成することはできません。
ClassName
質問を見ると、クラスが静的である場合、メモリ内にインスタンスが1つしかないため、以下のプロパティに2つの異なる値を設定することはできません。
ClassName.MemberName
詳細はこちら
従業員をカプセル化する情報と操作を保存する必要があるとします。
class Employee
{
string Name {get; set;}
double HourlyRate {get; set;}
double CalculatePay(int hoursWorked) { . . . }
}
では、プログラムで2人の従業員を同時に比較する必要があるとしましょう。
その通り!非静的なemployeeクラスを使用すると、Employeeクラスの2つ(またはそれ以上)のインスタンスをインスタンス化できます。これらのオブジェクトはそれぞれ、異なるEmployeeを表します。
あなたはこれを行うことができませんでした従業員は静的でした。
例えば
void CompareEmployees(Employee empA, Employee empB)
{
if(empA.HourlyRate < empB.HourlyRate)
Console.WriteLine("Employee {0} has a higher rate than {1}", empA.Name, empB.Name);
else if(empA.HourlyRate > empB.HourlyRate)
Console.WriteLine("Employee {0} has a higher rate {1}", empb.Name, empA.Name);
else
Console.WriteLine("{0} and {1} have the same rate", empb.Name, empA.Name);
}
クラスを建物の青写真と考え、そのクラスのインスタンス(オブジェクト)を青写真の設計に従って建てられた建物と考えてください。
1つの設計図があれば、多くの建物を作成できます。これらの建物はそれぞれ同じ構造ですが、それぞれが独立しています。1つはドアを開け、もう1つはドアを閉めることができます。
静的クラスは、家を建てるために使用することのできない青写真のようなものです。引き裂いたり、コーヒーをこぼしたりすることはできますが、実際のドアがなく、ドアのデザインしかないため、設計図のドアを開くことはできません。
この状況を説明する別の方法は、「状態」を考慮することです。建物(オブジェクト)にはいくつかの状態(たとえば、ドアが開いているかどうか)があり、各建物の状態は異なる可能性があります(たとえば、自分のドアが開いているかどうか)。ブループリント(クラス)も(静的)状態(たとえば、コーヒーがこぼれたかどうか)を持つことができますが、これはブループリントに従って建てられた建物に関連付けられた状態とは異なり、異なります。
public class House {
private static boolean isCoffeeSpilt;
private boolean isDoorOpen;
public static void spillCoffee() {
House.isCoffeeSpilt = true;
}
public void openDoor() {
isDoorOpen = true;
}
}
public static class Program {
public static void main(String[] args) {
House redHouse = new House(); // 1
House blueHouse = new House(); // 2
redHouse.openDoor(); // 3
House.spillCoffee(); // 4
}
}
House
上記の例では、静的クラスの場合、1行目、2行目、および3行目は使用できません。クラス自体で呼び出されるwhileopenDoor
のインスタンスで呼び出されることに注意してください。また、4行目の時点で、赤い家のドアは開いていますが、青い家のドアはまだ閉じていることに注意してください。House
spillCoffee
非静的クラスの利点は、静的クラスが単体テストにひどいことです。静的クラスは簡単にモックすることができず、インターフェイスをサポートしていません。
静的クラスはインスタンス化できません(技術的にはインスタンス化されますが、一度だけです)。静的コンストラクターは「通常」クラスへの最初のアクセス時に呼び出されます。これは追跡と調整が難しい場合があります。静的クラスは、いくつかのユーティリティメソッドを収集するだけの1つのクラスが必要な場合に適しています。.netフレームワークの数学は良い例です。また、拡張メソッドにも役立ちます。それ以外は使用しません。
単一のインスタンスが必要で、静的クラスの制約に縛られたくない場合は、シングルトンパターンが非常に便利です。シングルトンと静的クラスの違いについての素晴らしい記事。
そしてもちろん、非静的クラスはインスタンス化され、変数に格納され、複数回インスタンス化される必要があります。
例:
静的クラス、ファイルをロードするための単なるヘルパーメソッド:
static class TextureHelper
{
public static byte[] LoadFromFile(string aFileName);
}
テクスチャを作成するための主要なポイントであるシングルトン。
public sealed class TextureManager
{
public static TextureManager Instance{get;set;}
public Texture CreateTexture();
}
実際のテクスチャ。これは、アプリケーションに多く含まれている可能性があります。
public class Texture
{
}