2010-12-11 12 views
7

タイトルが示唆しているように、なぜ静的クラスに静的メンバーしか持たないのかを理解したいと思います。私はそれがすべてのプログラミング言語で同じであることを願っています。それで、すべての言語で説明が同じになると私は信じています。なぜ静的クラスは静的メンバーのみを持つことができますか?

+3

あなたはこれを考えましたか?静的クラス内の非静的メンバーを許可する目的は何でしょうか? – mpen

+0

私はルール '静的クラスは非静的メンバーを持つことはできません'を知っています。しかし、私は理由を理解したかった。実際に私は、静的なクラスとそのメンバーがどのように格納されるか、非静的なクラスとメンバがどのように格納されるかというように、メモリの面でもっと不気味な答えを期待していました。 :) – NLV

答えて

14

スタティッククラスはインスタンス化できないため、インスタンスは存在しません。非スタティックメンバーには、そのクラスのインスタンスがアクセスする必要があります。静的クラスはインスタンスを持つことができないので、静的でないメンバーにアクセスすることはできません。

インスタンスメソッドが呼び出されることはありませんでしたので、そのための静的クラスは静的メンバーのみおそらく

2

を持つことができます。

1

静的でないメンバーを静的なクラスに配置すると、静的なクラスではありません。 (静的クラスをインスタンス化することはできません。非静的メンバーを持つためには、それらのメンバーを呼び出すクラスのインスタンスを作成できなければなりません)。

それを見るには別の方法として、クラスを静的としてマークすることで、静的メソッドをそのクラスに置かないようにコンパイラに意図的に求めています。これは設計上の決定であり、コンパイラは自分自身に従うことを確認するのに役立ちます設計。

4

静的クラスをインスタンス化することはできません。したがって、非静的メンバーにアクセスすることはできません。

静的メンバーを混在させて一致させる場合は、クラスを静的にしないでください。

7

これは設計上の決定ではなく、論理的なものです。

静的クラスは、インスタンス化できないクラスです。つまり、そのクラスのタイプのオブジェクトを作成することはできません。

非スタティックメンバーは、クラスの特定のインスタンスに関連付けられています。これらのデータには、のデータが含まれています。には、そのクラスタイプのオブジェクトが1つあります。

静的クラスに非静的メンバーが含まれている場合、その静的クラスの型のオブジェクトを決してインスタンス化できないため、そのデータにアクセスしたり、そのメソッドを呼び出すことはできません。代わりに、のstaticメンバーをクラスの静的インスタンスから直接呼び出すことができます。

ただし、には、静的メンバーを含む非静的クラスがあります。これにより、そのクラスのオブジェクトをインスタンス化せずに、データにアクセスしたり、静的メンバーとして公開されているメソッドを呼び出すことができます。ただし、は、そのクラスの型のオブジェクトをインスタンス化し、非静的(またはインスタンス)メンバーにアクセスできます。たとえば、クラスCircleの場合は、CalculateArea関数とPIフィールドのような静的メンバーを持つことができます。これらのメンバーは、サークルであるという事実によって、一般にすべてのサークルに適用されます。しかし、特定のインスタンスに関連付けられた非静的メンバーを持つこともできます。特定の円オブジェクトが記述されているため、このクラスのインスタンスに関連付けられています。フィールドはDiameterCircumferenceです。また、その特定のインスタンスの非静的フィールドに格納されているデータを使用すると、円の面積を計算する非静的関数を持つこともできます。

-1

これが関連しているかどうかはわかりませんが(少なくともC#.net 4.0では)、静的クラスに非静的メンバーを含む非静的クラス定義を含めることができます。だから、ネストされた型はmemberと見なされるので、静的でないメンバーを静的なクラスに追加できるようです。

例:

public static class MyClass 
{ 
    /// <summary> 
    /// This non-static class is accessible and able to be instantiated through the 
    /// static class MyClass. 
    /// </summary> 
    public class Type1 
    { 
     public String prop1 { get; set; } 
     public String funct1(String result) 
     { 
      return result; 
     } 
    } 

    /// <summary> 
    /// This function is inaccessible since it requires an instance of MyClass. 
    /// It will also cause a compile error. 
    /// </summary> 
    /// <returns></returns> 
    public String nonStaticFunc() 
    { 
     return "aString"; 
    } 

    /// <summary> 
    /// This function is accessible through the MyClass type because it is also static 
    /// and therefore does not require a class instance. 
    /// </summary> 
    /// <returns></returns> 
    public static String staticFunc(String str) 
    { 
     return str; 
    } 
} 

あなたが見ることができるように、静的MyClassクラスを使用するためにインスタンス化されなければならない非静的クラス定義のType1を持っています。 MyClassの静的関数staticFuncは、インスタンスにアクセスする必要はありません。

//Valid operations 

String result = MyClass.staticFunc("result"); //No class instance. 

MyClass.Type1 someObj = new MyClass.Type1(); //Class instance from static class containing non-static nested type. 
someObj.prop1 = someObj.funct1("hi"); 
関連する問題