一般的な概念
最初に、静的とは何かを理解する必要があります。 C#には、以下に適用できる静的キーワードがあります。
- 余白
- 物性
- 方法
- オペレーターへ
- イベント
- デザイナーに
- クラス
static class OneHuman { public static string Name { get; set; } public static int Age { get; set; } public static string GetInformation() { return string.Format("{0} is {1} years old", Name, Age); } }
静的は、クラスをインスタンス化する必要がないことを意味します。 クラスの上記のコンポーネントはすべて、名前を示すことでアクセスできます。
class Program { static void Main(string[] args) { OneHuman.Name = "Onizuka"; OneHuman.Age = 22; Console.WriteLine(OneHuman.GetInformation()); } }
クラス全体を静的にする必要はないことに注意してください。 個々のメンバーに静的変数を適用するだけで十分な場合もあります。
class Box { public static string DefaultContext { get; set; } public string Context { get; set; } }
クラス全体が静的な場合:
- newキーワードを使用してクラスをインスタンス化することはできません。
- 同じクラスの非静的メンバーを使用することはできません。
- 継承はサポートしていません。
- メソッドをオーバーロードできません。
クラスが静的ではなく、静的メソッドを含む場合、これらのメソッドには次の制限が適用されます。
- 静的から同じクラスの非静的メンバーを使用することはできません。 もちろん、静的メソッドでクラスインスタンスを作成することを気にする人はいません。
- 静的メンバーの継承とポリモーフィズムはサポートされていません。
詳細
上記では、このような構成を静的コンストラクターとは見なしませんでした。 私の意見では、クラスの静的コンストラクター呼び出しはいつ発生しますか?
class Box { static Box() { Console.WriteLine("static ctor was called"); } public Box() { Console.WriteLine("default ctor was calleds"); } public static string Data { get { return "You are trying to get data"; } } public const int Foo = 7; }
アクセス指定子が静的コンストラクターに使用されていないことにすでに気づいたと思います。 すべてが非常に明白であり、静的の作成を制御しません。 以下のコードを実行しようとすると、次のステートメントを確認できます。クラスのメンバーにアクセスする前に静的コンストラクターが呼び出されます。
class Program { static void Main(string[] args) { var data = Box.Data; var box = new Box(); } }
Boxクラスにアクセスする行のいずれかをコメント化することにより、いじることができます。 コードを少し変更して、ステートメントを微調整しましょう
class Program { static void Main(string[] args) { var data = Box.Foo; } }
この場合、静的コンストラクターの呼び出しは発生しません。 そのため、 静的コンストラクターは、定数を除き、クラスのメンバーにアクセスする前に呼び出されます。 この定義では、単語クラスを意図的に使用しました。 構造には多くの「ジョーク」があります。 C#では、デフォルトのコンストラクターをオーバーライドできないことに注意する必要がありますが、パラメーターなしで静的コンストラクターを定義できます。 ただし、常に呼び出されるわけではありません。たとえば、構造体の配列を作成しようとした場合などには呼び出されません。
静的の使用に関する一般的な考慮事項
静的クラスを使用する場合と使用しない場合は、比較的多くの意見があります。 私の経験に基づいて、静的クラスは初心者開発者のお気に入りの武器であることに注意してください。 使用され忘れられた-良いコンセプト。

静的の適用可能性に関する複雑さを理解するには、OOPの概念に戻る必要があります。 あなたは自転車を持っているが、あなたの隣人と隣人の隣人は自転車などを持っていると想像してください。 この場合、静力学は受け入れられません。 なぜなら 自転車の色、重量、車輪の数はさまざまです。 つまり、同じ種のさまざまなインスタンスです。 クラスのインスタンスの作成が暗示されていない場合、一部のグローバルオブジェクト/アクションに静的変数が適用されます(多くの場合、ユーティリティメソッドの場合:コンソールへの出力はConsole.WriteLine()、Array.Sort配列をソートします)。 多くの場合、クラスは静的機能と非静的機能の両方を提供できます。 疑わしい場合は、停止して「this」のコピーが必要かどうかを考えてください。 クラスのインスタンスの作成を本当に制御したい場合、または1つだけ持っている場合でも、これらの目的にはシングルトンパターンが最適です。 OOPのフレームワーク内で、静的変数には多くの欠点があります。 どうしてそんなに悪いの?
多型
上記のように、静的クラスは継承をサポートしていません。 インターフェイスまたは別のクラスから継承して機能を拡張することはできません。
テスト中
静的を使用する場合、テストは非常に困難です。 インターフェイスに基づいてコードをすばやく置き換えることはできません。 変更する必要がある場合は、真剣に、重要なコードを書き換えます。
唯一の責任
静的メソッドは、エラーログへの出力であろうと配列のソートであろうと、ビジネス目的でよく使用されます。 したがって、MegaUtilsと呼ばれるすべての静的機能を1つのクラスに詰め込みたいという要望があります。 これを行う価値はありません。それぞれが独自の活動分野を担当する小さなクラスを多数作成することをお勧めします。