C#プログラムでは、クラスのメンバ変数のすべてのインスタンスが唯一の役割を「情報隠蔽」をプレイしたデータを、操作することができることを意味し、グローバル変数の概念、ありません。しかし、時には、これは賢明な選択ではありません。
必要なクラスの数は、ブックを保存することができ、私たちはクラスライブラリを定義すると仮定し、すなわち、それぞれの追加の書籍(定義されたインスタンス)、書籍の数を追加する必要があります。何の静的変数が存在しない場合、我々はそれぞれの本(一例)に保存されている本の数を必要とする、しかし、そのような変数は、書籍(例)内の別のブック(インスタンス)で繰り返した単語の数が少ない格納される、我々は受け入れることができ、そのような数万として多くの本(インスタンス)の単語の数は、我々はより多くの耐え難い作成するどのくらいの(メモリ、ディスク容量など)資源の浪費を想像することができない場合は次のとおりです。なぜなら冊(インスタンス)の数に値は確かに異なっている各書籍(例)に保存されています。保存された図書(インスタンス)書籍(例)の数とこれらの同じのために、我々は新しい本が(新しいインスタンスを作成します)、他のすべての本(インスタンス)に格納された値を変更するたびに増加しなければなりません。ああ、私の神!あなたは、私たちは、グローバル変数を持っている回プログラミング方法、憧れ-プロセス指向を直すあこがれるます。静的変数:しかし、この状況は、別の変数の型のための準備ができ、C#のため、発生しません。それはクラスのグローバル変数、公的に格納されているクラス情報、すべてのクラスのインスタンス(オブジェクト)を共有する値に類似しています。
次のように静的変数を宣言するための構文は以下のとおりです。
<アクセス修飾子>静的なデータ型変数名;
クラスの他のメンバーとこのアクセス修飾子、内部のように、保護された、官民、またはそのようなことができるように。
通常のメンバ変数に加えて、静的なキーワードの前に、それは静的変数になります。静的変数とインスタンス変数は、さまざまな方法で保存されている全プログラムが終了するまで、最初に宣言した静的変数は、メモリ内に格納されています。インスタンスメンバーは、オブジェクトを作成するときにメモリを割り当て、データのコピーを格納します。だから、静的メンバ変数はクラスではなくオブジェクトに属すると考え。
次のように静的変数とインスタンス変数の違いは以下のとおりです。
1.メモリの割り当て
静的変数、アプリケーションが初期化されるとき、それはクラスでその終焉まで実行するプログラムの終わりまで、それらのメモリであり、
インスタンス変数は、後にのみインスタンス化する必要がありますメモリを割り当てます。
2.寿命
アプリケーションの現在のサイクルのための静的変数寿命の、
インスタンス化クラスの存在に依存し、本インスタンス変数周期。
3.道を呼び出し
、静的変数は唯一のクラスのインスタンスを呼び出すことができる「クラスの静的変数名は、」呼び出すことはできません;
インスタンス変数変数がインスタンス化されるクラスは、経由クラス名は直接アクセスインスタンス化したとき。
4.共有
、静的変数は、グローバル・オブジェクト・クラスのすべてのインスタンスによって共有される、すなわち、静的変数、同様の値の他の例の値を変更する例は、変更後読み出されている
共有されない、インスタンス変数がローカルでありますA。
アクセス方式
静的メンバは、インスタンスメンバにアクセスすることができない、
インスタンスメンバーは、静的メンバにアクセスすることができます。
クラスがロードされたときにメモリを割り当てるメモリの静的変数は、後で作成されたオブジェクトが使用され、適切なアクションが作動するように、このメモリにあります。また、代替グローバル変数として見ることができます。
だから、静的変数の初期化の値は一度だけ、訪問の背後にあるたびに、(たとえ内部関数で)最後に処理された値ですされます。すべてのインスタンス変数が初期化されます。
システム使用;
クラスプログラム
{
静的な無効メイン(文字列[] args)
{
//未定義の静的変数出力は、結果が0であり、また、自動的に0が割り当てられる変数の初期値なしでC#で記述
コンソール。 WriteLineメソッド(sort.i);
//アクセス方法静的変数(クラス名静的変数名)が、それはまた、外部静的変数で見ることができますが、神秘的な操作静的変数ではありません。
sort.i = 5;
//出力5
Console.WriteLineを(sort.i);
//コンストラクタは、静的変数の初期値で割り当てることができる、ハァッ、ハァッ
sortTestをソート=新しいソート();
3の割り当て//コンストラクタ出力;
Console.WriteLineを(sort.i );
}
}
クラスのソート
{
I int型のpublic static。
パブリックソート()
{
I = 3。
}
}
静的変数が参照するクラス名を使用する必要がありますが、静的変数は、任意のインスタンスに属しているが、共通していないため、クラスのインスタンスを使用することはできません。私たちは、アナロジーを描くことができます:クラスでは、いくつかの項目は、個人的、私たちが使いたい、品物の所有者が指摘されている必要があり、例えば、「王サン・バイク」プログラムC#で、私たちが使用することができます:王を3台の自転車フォーマット。アイテムの中には、すべてのオブジェクトに共通している、自分の名前を使用することはできませんが、そのような投資家のクラスグループとしてクラスの名前の使用は、バスケットボールを購入する、唯一の言った:「バスケットボールのクラスは、」我々が言うことができません:「キングIIIバスケットボールを」 。これは間違いなく十分ではありません、これは間違いなく他の人に公平ではない、我々は多くの腐敗した役人と考えることができ、自分のではないものの使用、または公共のものの個々の使用であると自分自身を台無しにします。
便利な発言はこれです:静的変数は、それを参照するクラス名です。すなわち:クラスの静的変数名の名前。
次のように一つの具体的な例は次のとおりです。
システムを使用しました。
System.Collections.Genericを使用しました。
System.Textのを使用しました。
クラスプログラム
{
クラスクラス1
{
公共の静的な文字列staticStr =「クラス」。
公共の文字列notstaticStr =「のObj」。
}
静的な無効メイン(文字列[] args)
{
クラスを介してアクセス//静的変数、同じ静的変数のすべてのインスタンスが同じ値であります
Console.WriteLineを( "クラス1のstaticStr:{0}"、Class1.staticStr)。
Class1のtmpObj1 =新しいのClass1();
tmpObj1.notstaticStr = "tmpObj1"。
Class1のtmpObj2 =新しいのClass1();
tmpObj2.notstaticStr = "tmpObj2"。
//非静的変数はオブジェクトを介してアクセスされる、異なるオブジェクトの同じ非静的変数が異なる値を持つことができ
Console.WriteLineを( "tmpObj1のnotstaticStr:{0}"、tmpObj1.notstaticStr)。
Console.WriteLineを( "tmpObj2のnotstaticStr:{0}"、tmpObj2.notstaticStr)。
Console.ReadLine();
}
}