web-dev-qa-db-ja.com

「静的」クラスとは何ですか?

C#での違いは何ですか:

public static class ClassName {}

そして:

public class ClassName {}
40
Jeremy H

静的クラスはインスタンス化できず、静的メンバーのみを含むことができます。したがって、静的クラスの呼び出しは次のようになります:MyStaticClass.MyMethod(...)またはMyStaticClass.MyConstant

非静的クラスはインスタンス化でき、非静的メンバー(インスタンスコンストラクター、デストラクタ、インデクサー)を含めることができます。非静的クラスの非静的メンバーは、オブジェクトを通じてのみ呼び出すことができます。

MyNonStaticClass x = new MyNonStaticClass(...);
x.MyNonStaticMethod(...);
40
lmsasu

まず、「静的」の意味について質問に対する回答のコメントがありました。 C#の用語では、「静的」は「型のインスタンスではなく、型自体に関連する」ことを意味します。参照や値の代わりにタイプ名を使用して、(別のタイプの)静的メンバーにアクセスします。例えば:

// Static method, so called using type name
Guid someGuid = Guid.NewGuid();
// Instance method, called on a value
string asString = someGuid.ToString();

さて、静的クラス...

静的クラスは通常、「ユーティリティ」クラスとして使用されます。正規の例はおそらく System.Math 。数学のインスタンスを作成することは意味がありません-それは単に「ある」だけです。いくつかのルール(「できる」と「できない」の両方):

  • 静的クラスは常にobjectから派生します。別の基本型を指定したり、静的クラスにインターフェイスを実装させたりすることはできません。
  • 静的クラスはインスタンスメンバーを持つことができません-すべての変数、メソッドなどは静的でなければなりません。
  • 静的クラスはインスタンスコンストラクターを宣言できず、コンパイラーはデフォルトでパラメーターなしのコンストラクターを作成しません。 (静的クラスがC#2.0で提供される前は、プライベートコンストラクターで抽象クラスを作成することがよくあり、インスタンス化を妨げていました。ここでは必要ありません。)
  • 静的クラスは暗黙的に抽象です(つまり、抽象クラスを記述するILにコンパイルされます)が、abstract修飾子を自分で追加することはできません。
  • 静的クラスは暗黙的にシールされます(つまり、それらはシールされたクラスを記述するILにコンパイルされます)が、sealed修飾子を自分で追加することはできません。
  • 静的クラスは一般的です
  • 静的クラスは、非静的クラスまたは静的クラスのいずれかにネストできます
  • 静的クラスmayには、非静的または静的なネストされた型があります。
  • 拡張メソッドを含めることができるのは、静的なトップレベルの非ジェネリッククラスのみです(C#3.0)。
67
Jon Skeet

静的クラスも継承できませんが、静的メンバーを持つ非静的クラスは継承できます。

6
Dan Herbert
public static class ClassName {}

静的クラスは、グローバル変数のようなものです。インスタンス化せずに、コードの任意の場所で使用できます。次に例を示します。ClassName。ドット演算子の後は、そのプロパティまたは関数を使用できます。

 public class ClassName {}

ただし、非静的クラスがある場合は、このクラスのインスタンスを作成する必要があります。例えば:

 ClassName classNameObject = new ClassName(); 
6
Syed Tayyab Ali

静的クラスのすべてのメソッド/プロパティmustは静的であるのに対し、「通常の」クラスはインスタンスと静的メソッドの混合を含むことができます。

5
Mark Simpson

静的クラスには静的メンバーのみを含めることができます。

静的メンバーは、最初にクラスをインスタンス化せずに使用できます。

3

静的クラスをインスタンス化(のオブジェクトを作成)することはできません。また、静的メンバーのみを含めることができます。

例:System.Math

3
Henk Holterman

http://www.javaworld.com/javaworld/javaqa/1999-08/01-qa-static2.html -これに関する非常に良い記事。これはJava用です。しかし、私はC#でもコンセプトは同じであるべきだと思います。

2

静的クラスと静的メンバーは、クラスのインスタンスを作成せずにアクセスできるデータとメソッドを作成するために使用されます(newキーワードを使用して、コンストラクターを持つことはできません)。

静的クラスは、それ自体のオブジェクトIDに依存しないときに宣言できるため、静的クラスには静的メンバーのみを含める必要があります。

このクラスは、クラスを含むプログラムまたは名前空間が読み込まれるときにCLRによって読み込まれます。

また、それらは密封されており、継承することはできません。

2
CMS

cの静的変数

自動変数としてクラスにローカルな変数ですが、関数がアクティブでなくなっても静的変数は消えません。それらの値は持続します。制御が戻った場合、静的変数は同じ値を持ちます

cの静的関数他のファイルの関数からは見えない関数。

*cppの静的データメンバー*データメンバーは変数またはcppの関数にすることができますstaticは両方のデータメンバーに適用されますクラス自体は静的にすることができます "そのクラスのすべてのオブジェクトによって共有される静的データメンバーの1つのコピー」静的データメンバーは、静的データメンバーのみにアクセスできます

静的クラスこのクラスはオブジェクトをインスタンス化できません

1
richu