C#の統計

運命の意志により、近年、私は別の非常に魅力的な趣味を学んでいます。 私はC#プログラマになりたい人たちに教えています。 技術、人文科学、自分の自由意志のある人、組織から送られた人など、人はさまざまです。 さまざまなレベルにもかかわらず、私はそれらを訓練する必要があります。 したがって、私は常に教材を更新し、改善しようとします。 これに関連して、私は結論に至りました:「しかし、それらを使用するのが便利になるように、テキスト形式で資料を作成することは悪くないでしょう」。 カットの下で、最近発行された講義の1つの例としてレイアウトしました。





一般的な概念


最初に、静的とは何かを理解する必要があります。 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; } }
      
      







クラス全体が静的な場合:





クラスが静的ではなく、静的メソッドを含む場合、これらのメソッドには次の制限が適用されます。





詳細


上記では、このような構成を静的コンストラクターとは見なしませんでした。 私の意見では、クラスの静的コンストラクター呼び出しはいつ発生しますか?



 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つのクラスに詰め込みたいという要望があります。 これを行う価値はありません。それぞれが独自の活動分野を担当する小さなクラスを多数作成することをお勧めします。



All Articles