C#の静的メソッドと非静的メソッドの比較


C#静的メンバー
静的メンバーはクラスのすべてに属し、クラスのインスタンスに共通しています.クラスがどれだけ多くのインスタンスを作成しても、クラスの静的メンバーはメモリ内で同じ領域しか占めません.
  • 、静的メンバーはクラスの所有に属し、非静的メンバーはクラスのインスタンスの所有に属する.
  • 、クラスを作成するインスタンスごとに、都市はメモリ内で非静(動)状態のメンバーのために新しいストレージを割り当てます.
  • 静的データ・メンバーは動的データ・メンバーとは異なり、静的変数は安定しているわけではありません.ただ、静的変数は宣言時に付与されているかどうかにかかわらず、そのタイプに基づいて対応するメモリ領域を割り当てます.彼のアクセス性と作用区間は動的変数と同じです.
    非静的クラスには、静的メソッド、フィールド、プロパティ、またはイベントが含まれます.クラスのインスタンスが作成されていない場合でも、クラスに対して静的メンバーを呼び出すことができます.静的メンバーは常にインスタンス名ではなくクラス名でアクセスされます.静的メンバーにはコピーが1つしか存在しません.(作成されたクラスのインスタンス数に関係します).静的メソッドと属性は、メソッドパラメータで明示的に渡さない限り、オブジェクトのインスタンス変数にアクセスできません.静的メソッドと属性は、非静的フィールドとイベントを含むタイプではアクセスできません.より典型的な方法は、静的メンバーを持つ非静的クラスを宣言することです.(クラス全体を静的として宣言するのではなく)静的フィールドの2つの一般的な用途は、インスタンス化されたオブジェクト数のカウントを保持するか、すべてのインスタンス間で共有する必要がある値を格納することです.静的メソッドは、クラスに属し、クラスに属していないため、リロードできます.フィールドはstatic constとして宣言できませんが、constフィールドはその動作の面で本質的に静的である.タイプに属し、タイプのインスタンスには属しません.したがって、静的フィールドに使用する同じClassNameを使用することができる.通常フィールドにアクセスするには、MemberName表現を使用します.オブジェクトをインスタンス化する必要はありません.
    通常、メソッドの3つの形式を呼び出します.
    	class Program
        {
            static void Main(string[] args)
            {
                //     ,     ,         
                ClassName someClass = new ClassName();
                ClassName.Method();
                //     ,         ,          
                ClassName.instance.Method();
                //     ,           
                ClassName.Method();
    	}
    }
    

    静的方法とインスタンス化方法について誤解することがある.
    次のリンクを参照してください.https://blog.csdn.net/BIAOBIAOqi/article/details/6732117
    1、「静的メソッドはメモリに常駐しているが、インスタンスメソッドはそうではないので、静的メソッドは効率的だがメモリを占める」と考えられている.
    一つ知っておくべきだ.NETタイプの静的方法はこれに属する.NETタイプです.そしてこれはNETタイプは1つです.NETプログラムセットの一部.これNETプログラムセットは、AppDomainによってメモリにロードされます.このAppDomainはメモリからアンインストールできます.一つはあります.NET CLRのプロセスには複数のAppDomainがあり、最初のAppDomain以降のAppDomainは動的に作成およびアンインストールできます.これらのAppDomainのNETプログラムセットには,静的メソッドもインスタンスメソッドもある.静的メソッドでもインスタンスメソッドでも、プログラムセットが存在するAppDomainとともに作成およびアンインストールされます.最初のAppDomainは、プログラム全体の実行が終了すると最後にアンインストールされます.その中に含まれるNETプログラムセットも自然にアンインストール
    静的メソッドには常駐メモリは存在しないという説があり、ロードタイミングやメモリ占有では、静的メソッドとインスタンスメソッドは同じであり、タイプが初めて使用されたときにロードされる.呼び出しの速度にはほとんど差がありません.
    2、「スタティックメソッドはスタックにメモリを割り当て、インスタンスメソッドはスタックに」
    実際には、すべての方法でスタックやスタックにメモリを割り当てることはできません.方法は、コードとして特殊なコードメモリ領域にロードされ、このメモリ領域は書き込み不可です.
    メソッドがより多くのメモリを消費しないのは、staticかどうかとは関係ありません.フィールドは各インスタンスオブジェクトの情報を格納するために使用されるため、フィールドはメモリを占有します.各インスタンスオブジェクトのステータスが一致しないため(少なくとも一致しているとは思えない)ため、各インスタンス・オブジェクトのすべてのフィールドはメモリにコピーされます.これにより、現在操作しているオブジェクトがどのオブジェクトであるかを区別できます.ただし、メソッドは異なり、インスタンス・オブジェクトがいくつあるかにかかわらず、メソッドのコードは同じなので、コードが1つあれば十分です.したがってstaticかnon-staticかの方法では、コードが1つしか存在しません.つまり、メモリ領域が1つしか消費されません.同じコードなのに、なぜ実行して表現が違うのですか?これはメソッドで使用されるデータに依存します.主に2つのデータソースがあります.1つはメソッドのパラメータを介して渡され、もう1つはclassのメンバー変数の値を使用します.
    3、「インスタンスメソッドはインスタンスを作成してから呼び出す必要があります.面倒ですが、静的メソッドは使いません.簡単です」
    実際に、メソッドがクラスのインスタンスオブジェクトとは無関係であれば、インスタンスメソッドと書くべきではなく、静的であるべきです.したがって、すべてのインスタンスメソッドはインスタンスに関連しており、インスタンスに関連している以上、インスタンスを作成することは必然的なステップであり、簡単に説明するのは面倒ではありません.
    もちろん、すべてのインスタンスメソッドを静的に書くことができます.インスタンスをパラメータとして入力すればいいです.一般的には問題はありません.
    オブジェクト向けの観点から、インスタンス化メソッドまたは静的メソッドの使用を選択する場合は、そのメソッドがインスタンス化オブジェクトと論理的に相関しているかどうかに基づいて、インスタンス化オブジェクトを使用する場合は静的メソッドを使用する必要があります.これはオブジェクト向けの観点から言っただけです.
    スレッドのセキュリティ、パフォーマンス、互換性から見てもインスタンス化手法が望ましい.
    なぜ静的メソッドとインスタンス化メソッドを区別するのですか?
    もし私たちが深く研究し続けるなら、技術から離れて理論を話さなければなりません.初期の構造化プログラミングでは、ほとんどの方法が「静的方法」であり、インスタンス化方法の概念を導入することはオブジェクト向けの概念が現れてからのことであり、静的方法とインスタンス化方法を区別することは性能だけでは理解できず、c++、java、c#のようなオブジェクト向け言語を作成するマスターがインスタンス化方法を導入することは、必ずしも性能、メモリの問題を解決するものではない.開発をよりモデル化し,オブジェクト化するためである.このように,静的手法とインスタンス化方式の区別はモードの問題を解決するためである.