の static
初心者が把握するためのキーワードは、少し難しいことができます。その主な目的は、クラスの特定のインスタンスではなく、クラス自体に属するものとしてクラスメンバを識別することです。
詳細を説明しすぎることなく、C#(およびJava)は、すべてのコードとデータがオブジェクトに属している必要があるというオブジェクト指向の理想を厳密に実施します。これは、一般に、現実世界のものを表すオブジェクトの基本的な信条が適用される場合は常にベストプラクティスです。ただし、常にそうとは限りません。必要なのは、コード内のどこからでもアクセスできる関数または変数であり、それを含むオブジェクトへの参照を渡す必要がなく、見たり変更したりするデータが正確であることを保証するものです何を誰もそれ以外の場合は、オブジェクトの別のインスタンスに属しているコピーではなく、処理しています。
このような動作は、オブジェクトにカプセル化されていない「グローバル」関数または変数の形式でCおよびC ++で使用できました。そのため、C#とJavaは妥協案として、「静的スコープ」をサポートします。これは、親オブジェクトのない真のグローバルコードとスコープが限定されたインスタンスメンバーの中間点です。
として宣言されたすべての「コードメンバー」(関数、プロパティ、フィールド)static
は、プログラムのmain()
関数の最初の行からスコープに入り、main()
関数が終了するまでそれを残しません。簡単な英語では、静的メンバーが存在し、プログラムが実行されている限り使用できます。さらに、静的メンバーは、その型の1つのインスタンスのメンバーではなく、型自体のメンバーとして呼び出すことで呼び出されます。
public class Foo
{
public int MyInt {get;set;} //this is an "instance member"
public static int MyStaticInt {get;set;} //this is a "static member"
}
...
var myFoo = new Foo();
myFoo.MyInt = 5; //valid
myFoo.MyStaticInt = 5; //invalid; MyStaticInt doesn't belong to any one Foo
Foo.MyInt = 5; //invalid; MyInt only has meaning in the context of an instance
Foo.MyStaticInt = 2; //valid
これにより、静的メンバーは、型の単一インスタンスについて知っているかどうかに関係なく、型を知っているコードに対して可視になります。
質問に答えるために、何かを静的としてマークする主な利点は、使用するコードが包含オブジェクトのインスタンスを持っているか取得できるかどうかに関係なく、型自体が知られている場所で見えるようになることです。少しもありますパフォーマンス上の利点ます。メソッドは静的スコープ内にあるため、(同じクラスまたは他の)他の静的メンバー、およびパラメーターとして渡されるもののみにアクセスできます。したがって、ランタイムは、通常はコンテキスト固有の状態情報を提供するためにインスタンスメソッドを使用する必要があるため、コンテナオブジェクトの現在のインスタンスへの参照を解決する必要はありません。
クラス全体を静的としてマークすることもできます。そうすることで、クラス宣言が静的メンバーのみで構成されるため、インスタンス化できないことをコンパイラーに伝えます。これは、メモリ内にオブジェクトのコピーが1つだけ存在するようにする簡単な方法です。クラスとその中のすべてを静的にします。ただし、これがそのようなニーズに最適なソリューションであることは非常にまれです。データセットのコピーを1つだけ必要とする状況では、通常、代わりに「シングルトン」が推奨されます。これは非静的クラスであり、静的アクセサーと非パブリックコンストラクターを使用して、自身の単一インスタンスへのアクセスを提供します。理論的には、シングルトンは完全に静的なクラスとほぼ同じ利点を提供しますが、インスタンスベースのオブジェクト指向の方法でクラスを使用する機能が追加されています。