2009-07-04 10 views
1

1)静的クラスメンバを使用して、オブジェクトアイデンティティに依存しないデータと動作を分離することができます。オブジェクトに何が起こっても、データと関数は変更されません。静的クラスは、オブジェクトのIDに依存するクラス内のデータや動作がない場合に使用できます。静的クラスを正当化するとき、これはどういう意味ですか?

オブジェクトに何が起こっても機能に変化はないということは何ですか?関数はどのように変化しますか?静的変数、はい、しかし関数ですか?

「オブジェクトの同一性」とはどういう意味ですか?それは、例えば、家のオブジェクトの特定の家ですか? (だから我々は特別に選ばれた家を扱う)。だから静的なクラスはどの家のオブジェクトでも動作しませんでしたか?

2)私がインスタンス状態で動作しない場合は、常に静的クラスを使用する必要がありますか?インスタンス状態で動作する静的クラスとインスタンスクラスの違いは何ですか?私が考えることができるのは、静的クラスは1インスタンスのみであるため、1インスタンスはクラスがインスタンス状態(スレッド同期がある場合)で動作した場合、多くの呼び出しがキューに入れられることを意味します。明らかに、静的な状態は静的なクラスだけを必要とします。

これは間違いありませんか?

答えて

1

1の質問に対する回答)

あなたはスピードというフィールドでCarオブジェクトを持っていることを想像してみてください。あなたは新しい車のオブジェクトを作成し、

public void SetSpeed(int value) 
{ 
    this.speed = value 
} 

を、この機能を使って、スピードプロパティを設定した場合、機能SetSpeedは、それがスピードプロパティにアクセスできるように初期化されている車のオブジェクトに依存するであろう。したがって、初期化された車がなければ、SetSpeedは呼び出すことができません。しかし、関数が静的であれば、特定の初期化されたカーオブジェクトにはアクセスできず、他の静的に定義されたオブジェクトにしかアクセスできませんでした。

2の質問に対する回答) 静的関数は、そのインスタンスの状態項目と静的関数の仕事は意味をなさない持つ、任意のインスタンス宣言された関数や変数にアクセスすることはできません。

+0

長い間私を助けるために、1)をいつ使用するかの例がもうありますか?だから、静的なクラス/メソッドは、車のインスタンスに関連しないものを変更することかもしれません。 ポイント2)十分です。 – dotnetdev

+0

静的メソッドはインスタンス化されたオブジェクトに属しません。したがって、呼び出されたときに渡されたパラメータは変更されません。特定の型の新しいオブジェクトをインスタンス化する静的メソッドをクラスに持たせることができます。 HttpWebRequestオブジェクトでこのような振る舞いを見ることはできませんが、HttpWebRequest.Create/CreateDefaultメソッドを使用してそのクラスのインスタンスを作成する必要があります。 –

1

スタティッククラスにはインスタンスがありません。アセンブリがロードされると、すべての静的クラスのすべての静的メソッドがすぐにアプリケーションで使用できるようになります。これを言う別の方法は、new演算子を使って静的クラスのインスタンスを作成する必要がなく、そのクラスのメソッドを使用することです。

実際には、静的なクラスでは状態を処理しないため、メソッドが不変になりスレッドセーフになります。スタティックメソッドではスレッドキューイングは行われません。すべてのコールはすぐに実行されます。あなたが正しく指摘したように、使用可能なクラスのインスタンスが複数存在しないため、オブジェクトIDはありません。

拡張メソッドとユーティリティメソッドは、静的クラスの静的メソッドの典型的な例です。彼らは一般にオブジェクトを受け入れ、操作し、同じタイプまたは異なるタイプの新しいオブジェクトまたは変更されたオブジェクトを返します。 1つのポスターが指摘するように、クラスインスタンスが存在しないため、クラス変数を保持する場所がないため、コール間に状態はありません。メソッドが返ってくると、処理の目的でメソッド内で定義された変数はすべてスコープから外れます(失われます)。

3

静的メソッドを、特定のクラスに関連するヘルパー関数を作成する方法として扱う傾向があるので、オブジェクトをインスタンス化することなくグローバルに使用できます。非常に簡単な例は次のようになります。

public class Person 
{ 
    private string name; 
    private DateTime dob; 

    public Person(string name, DateTime dob) 
    { 
     this.name = name; 
     this.dob = dob; 
    } 

    public int Age { get { return CalculateAge(this.dob); } } 
    public string Name { get { return this.name; } } 

    public static int CalculateAge(DateTime dob) 
    { 
      // use dob to work out age. 
    } 

} 

は、だから私は人物オブジェクトを作成する場合は、あなたが見ることができる上記のシナリオでは、私は読み取り専用プロパティを使用して、年齢の計算をカプセル化することができます。私は日付に基づいて、誰かの年齢をうまくするために必要な場合は、特定の人物オブジェクトoutwith、私は

// object usage 
var p = new Person("Joe Bloggs", DateTime.Parse("10/11/1981")); 
Console.WriteLine(p.Age); 

// static usage 
Console.WriteLine(Person.CalculateAge(DateTime.Parse("10/11/1981")); 
+0

CalculateAgeはDateTimeデータにのみ作用するので、私はPerson(dobインスタンスのデータに作用することができる)の非静的なAge属性にするか、Personの* private静的メソッドをAgeプロパティを実装するのに役立ちます)、またはDateTimeクラスのパブリックメソッドです。 – ChrisW

+0

@Chris、上記のとおり、これは単なる非常に簡単な例です。静的メソッドの使い方とその理由を明確にするだけです。 – James

+0

静的なデータを操作する静的なメソッドを使用する傾向があります。たとえば、 "静的なbool AreFriends(Person lhs、Person rhs)"はPersonの静的メソッドで、 Personインスタンスをそのパラメータとして(渡されたPersonインスタンスのprivateメンバーにアクセスできる) – ChrisW

2

静的メソッド、つまり静的メソッドを使用することができ、特定のクラスにタグ付けされたグローバル関数よりも少しあります。主に多重継承のない言語の回避策として使用されています。

public static class geometry_facilities 
{ 
    public static Double circumference (Double radius) 
    { 
    return radius * 2 * Math.PI 
    } 
} 

とあなたがどこにもこの機能にアクセスすることができます:

あなたは半径の円周を計算し、この機能は、プロジェクト内のすべての上に必要とされる機能を持っている場合は、次のようなクラスを作ることができ

geometry_facilities.circumference (6.730); 

これを行うためのオブジェクト指向の方法は、は、静的なものを使用し、代わりに機能的に引っ張ってgeometry_facilitiesから継承掛けないになります。静的メソッドは、OO言語で主に使用され、コードの再利用を容易にするために単一の継承のみを使用します。

+0

+1:私は前にその方法を考えていませんでした。 –

+0

C#は複数のインターフェイスを継承できます。回避策として使用できますか? –

+0

インタフェースには実際のコードを含めることはできません。 – Blorgbeard

1

オブジェクトに何が起こっても機能に変化はないということは何ですか?関数はどのように変化しますか?静的変数、はい、しかし関数ですか?

「静的なデータと関数の代わりに、オブジェクトに何が起きても変化しない」と言うと、静的なデータと関数は影響を与えず、影響を受けない、オブジェクトの特定のインスタンスに変更します。この内のクラスのように与え例えば

、...

public class Car 
{ 
    int m_speed; 
    public int Speed { set { m_speed = value; } } 
} 

...いくつかの静的データと静的メソッドは、このようなことかもしれません...

public class Car 
{ 
    int m_speed; 
    public int Speed { set { m_speed = Math.Max(value, s_maxSpeed; } } 
    //static data and static method 
    static int s_maxSpeed; 
    public static void SetMaxSpeed(int maxSpeed) { s_maxSpeed = maxSpeed; } 
} 

...たとえば、s_maxSpeedの値が存在し、Carインスタンスが存在するかどうかにかかわらず、静的なSetMaxSpeedメソッドを呼び出すことができます。

"オブジェクトアイデンティティ"とは何ですか?それは、例えば、家のオブジェクトの特定の家ですか? (だから我々は特別に選ばれた家を扱う)。だから静的なクラスはどの家のオブジェクトでも動作しませんでしたか?

「オブジェクトアイデンティティ」と「オブジェクトインスタンス」は同じことを意味します。それらは同義語です。 object.ReferenceEqualsメソッドを使用すると、オブジェクトのアイデンティティーをテストできます。つまり、2つのオブジェクト参照が同じ(同一の)インスタンス/アイデンティティを指しているかどうかを確認できます。

私がインスタンス状態で動作しない場合は、常に静的クラスを使用する必要がありますか?

すべて(非インスタンス状態であっても)は何らかの種類(たとえば、、static)クラスです。

インスタンス状態で動作する静的クラスとインスタンスクラスの違いは何ですか?私が考えることができるのは、静的クラスは1インスタンスのみであるため、1インスタンスはクラスがインスタンス状態(スレッド同期がある場合)で動作した場合、多くの呼び出しがキューに入れられることを意味します。

1つの違いは、静的データは常に存在しますが、インスタンスデータはインスタンスが作成される前または作成されるまで存在しないことです。静的クラスはシングルトンオブジェクトに似ているのは間違いありません。

しかし、スレッドの同期が必要な場合でも、「同期」は自動的には発生しません(静的であるかシングルトンであるかにかかわらず)。いずれの場合も、明示的に実装する必要があります(例:lockキーワード等)。

関連する問題