C#のstatic静的変数の使い方

5162 ワード

静的グローバル変数
定義:グローバル変数の前に、キーワードstaticを付けると、この変数は静的グローバル変数として定義されます.
特徴:A、この変数はグローバルデータ領域にメモリを割り当てる.B、初期化:明示的に初期化しない場合、暗黙的に0に初期化される.
静的ローカル変数
定義:ローカル変数にstaticキーワードを付けると、静的ローカル変数が定義されます.
特徴:A、この変数はグローバルデータ領域にメモリを割り当てる.B、初期化:明示的に初期化しない場合、暗黙的に0に初期化される.C.プログラムの実行が終了するまで、常にグローバルデータ領域に存在する.ただし、その役割ドメインはローカル役割ドメインであり、定義された関数または文ブロックが終了すると、その役割ドメインは終了します.
静的データ・メンバー
特徴:A、メモリ配分:プログラムのグローバルデータ領域に配分する.B、初期化と定義:a、静的データメンバー定義時にスペースを割り当てるため、クラス宣言では定義できません.b、このクラスを使用する複数のソースファイルにおいて、その定義が重複しないようにするため、クラスのヘッダファイルに定義することはできない.c、静的データメンバーは、プログラムが実行されると必ず存在するため、その初期化の最適な位置はクラスの内部で実現される.C、特徴a、public,protected,privateのキーワードに対する影響それは普通のデータメンバーと同じで、b、その空間はグローバルデータ領域で分配され、すべての本クラスのオブジェクト共有に属するため、それは特定のクラスオブジェクトに属さず、クラスオブジェクトが発生していない時にその役割ドメインが見え、つまりクラスのインスタンスが発生していない時、私たちはそれを操作することができます.D、アクセス形式a、クラスオブジェクト名.静的データ・メンバー名E、静的データ・メンバーは、主にクラスのすべてのインスタンスが持つ属性で使用されます.たとえば、預金クラスの場合、アカウントはインスタンスごとに異なりますが、インスタンスごとに利息は同じです.したがって、利息を預金クラスの静的データメンバーに設定する必要があります.これには2つの利点があります.1つ目は、複数の預金クラスオブジェクトを定義しても、利息データメンバーがグローバル領域に割り当てられたメモリを共有するため、ストレージスペースを節約することです.第二に、利息が変更される必要がある場合、一度変更すれば、すべての預金類の対象の利息が変更されます.実際には1つのものを共有しているからです.
静的メンバー関数
特徴:A、静的メンバー関数はクラスに関連し、クラスのオブジェクトに関連しない.B、静的メンバー関数は、非静的データメンバーにアクセスできません.理由は簡単で、非静的データ・メンバーは特定のクラス・インスタンスに属します.≪アクション|Actions|emdw≫:主に静的データ・メンバーの操作に使用されます.
呼び出し形式:クラスオブジェクト名.静的メンバー関数名()
static静的変数の例と分析
 class class1
    {
        static int i = getNum();
        int j = getNum();

        static int num = 1;

        static int getNum()
        {
            return num;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("i={0}",i);
            Console.WriteLine("j={0}", new class1().j);
            Console.Read();
        }
    }

解析:Console.WriteLine("i={0}",i);ここでistatic変数であり、クラスclass1は初めて参照され、class1のすべてのstatic変数にメモリを割り当てる必要があります.現在、ハイパースレッド技術があるにもかかわらず、命令は論理的に1つずつ順次実行されるので、static int iにメモリが割り当てられ、intのデフォルト値0が保持され、static int numの変数にメモリが割り当てられ、値も当然0である.
次に第2のステップを実行して、変数に値を割り当てます:まずstatic int i変数に値を割り当てて、i=getNum()getNumの中のコードを見て、return numで、この時numの値は0で、そこでi0です.その後、変数numに値を割り当て、num=1;の行コードが実行されると、num1になります.
最終的な結果は次のとおりです.
 i0 j1

クラスを一度に参照すると、クラス内の静的変数にメモリ領域が順番に割り当てられ、メモリ領域がすべて割り当てられた後、静的変数に順番に割り当てられます.
staticの長所は何ですか?なぜstatic変数や関数を使用するのですか?
頻繁に使用されるものがあります.使用するたびにnewを再利用すると、このオーバーヘッドが高くなる可能性があります.staticを使用してメモリに保存している場合は、newの空間初期化データを再利用する必要はありません.staticは、アプリケーションが終了するまで、システムのキャッシュ機能を実現するために使用される.
静的メンバーには、静的フィールドと静的プロパティ、静的メンバーとクラスが関連付けられ、オブジェクトに依存せずに存在し、クラスのみがアクセスでき、オブジェクトからアクセスできません.
静的メンバーはクラスの所有に属し、インスタンスオブジェクトの作成数は認められず、静的メンバーはメモリに1部しかありません.インスタンスメンバーはクラスのインスタンスのすべてに属し、インスタンスオブジェクトを作成するたびに、インスタンスメンバーはメモリにメモリ領域を割り当てます.したがって、静的メンバーは、データベース接続文字列などの共有データセグメントを格納するために一般的に使用されます.
1つのクラスが静的メンバーと静的メソッドのみを含む場合、クラスは静的クラスとして定義され、クラスにstatic修飾子を付けることができる.
静的メソッドと非静的メソッド:
一、性能上:静的方法とインスタンス方法の差は大きくない.すべてのメソッドは、静的メソッドでもインスタンスメソッドでも、JITがクラスをロードするときにメモリを割り当てます.静的メソッドはクラス名で参照され、インスタンスメソッドはオブジェクトインスタンスで参照されます.インスタンスを作成すると、クラスのメソッドにメモリは割り当てられず、すべてのインスタンスオブジェクトが1つのクラスのメソッドコードを共有します.従って,静的メソッドとインスタンスメソッドの呼び出しは,性能の差がわずかである.
二、静的方法はクラスからしかアクセスできない.インスタンスメソッドは、オブジェクトのみがアクセスできます.
利点:1、静的変数はクラスのロード時にメモリ2をロードし、使用時にNewで意味するクラス内のすべてのオブジェクトを作成する必要がなく、あるメソッドを呼び出すことができます.
欠点:1、ごみの回収のメカニズムは静的な変数を回収することができなくて、静的なクラスの変数はメモリに常駐します
c#における静的クラスのメリットとデメリット
欠点:
1、全タイプはプログラムの実行中に一度だけロードする.これは、よく使用されるタイプにとって、使用するたびにロードする必要はありません.効率が高い.しかし、あまり使われないタイプにとっては.2、静的タイプであれば、相当なメモリをずっと消費しなければならない.プログラムが停止するまで.またはアプリケーションドメインがアンインストールされます.したがって、一般的に使用されるタイプのみを静的タイプとして定義する必要があります.
メリット:
1.静的メンバーのみが含まれます.2、インスタンス化できません.3、密封されています.4.インスタンスコンストラクション関数(C#プログラミングガイド)を含めることはできません.
したがって、静的クラスの作成は、静的メンバーとプライベートコンストラクタのみを含むクラスの作成とほぼ同じです.プライベートコンストラクション関数は、クラスがインスタンス化されることを阻止します.
静的クラスを使用する利点は、コンパイラがインスタンスメンバーを偶然追加しないようにチェックを実行できることです.コンパイラは、このような実利を作成しないことを保証します.
静的クラスは密封されているため、継承できません.静的クラスにはコンストラクション関数は含まれませんが、初期値を割り当てるか、静的状態を設定するために静的コンストラクション関数を宣言することもできます.