0

簡単な質問:

インスタンスを変更しない場合、クラスを静的にする必要があることを読みました。したがって、Accountと呼ばれるクラスがあり、Id、Durationなどのプロパティがあり、これらがクラスによって変更されない場合、これを静的にすることができます。そうでない場合は、静的のままにする必要があります。

これは(インスタンス自体がそのプロパティを介して変化するかどうかにかかわらず)静的/インスタンスの決定にどのように影響しますか?

さらに、クラスが大量のパラメーターを受け取るが(たとえば、このAccountクラス、私たちのアナロジーに固執する)、インスタンスを変更しない場合(したがって、Account変数は変更されません-Account.x = y //ここでyは別のクラスからのものです) 、これはまだ静的にすることができると思いますか?それで、問題であるのはパラメータではなく、それらがどこから来ているのか、それは彼らが何をしているのか?

プロパティの場合、フィールドを静的にするかどうかを決定するときと同じ原則が適用されます(たとえば、フィールドが保持するデータの取得にコストがかかる場合は、1つのフィールドに保持させる-静的-間違っている場合は修正してください)。

C#の静的メソッド(これはパラメーターを処理するため、静的メソッドに分類されます)には100を超えるスレッドがあることに気付きました。良い質問と良い答えがあるので、これらすべてを読みます。

ありがとう

4

7 に答える 7

6

クラスを静的ではなく不変にしようとしているようですね。

簡単に言うと、C#3の静的クラスの定義は次のとおりです。「クラスは静的とマークできます。これは、静的メンバーのみで構成する必要があり、サブクラス化できないことを示します。System.ConsoleクラスとSystem.Mathクラスは次の良い例です。静的クラス。」

アカウントの場合、システム内のアカウントごとに個別のアカウントインスタンスが必要だと思います。だから私はあなたがそれを静的にしたいとは思わない。

于 2009-10-01T23:58:06.923 に答える
3

メソッドとクラスについて質問しているようですので、2つの質問があります。

方法は簡単です。ファクトリパターンを実装している場合。静的メソッドを使用します。読みやすさのためにクラスのインスタンスなしでメソッドを使用できるようにしたい場合(LogIt(などのユーティリティメソッドを考えてください)、静的メソッドを使用します。

私は宝くじに当選するのとほぼ同じ頻度で静的クラス(自分で書いたもの)を使用します。ですから、たくさん勝ったら、先に進んでたくさん使ってください。真剣に、サーバー環境では、スレッド/同時実行の問題は、あらゆる種類の恐ろしく遅くて苦痛な方法であなたを殺します。

于 2009-10-02T00:05:29.077 に答える
2

プロパティがクラスやその他の方法で変更されていない場合は、静的な読み取り専用、またはgetterプロパティのみを使用したconstフィールドにします。これは、特定のメソッドが静的であるかどうかには関係ありません。

編集:非静的クラスは、オブジェクトの「テンプレート」であり、そのテンプレートに基づいて(新しい)インスタンスを作成することで「使用」します。静的クラスは、渡されたパラメーターに対してのみ動作する、自己完結型のコードスニペットであるメソッド(関数)の単なる組織的な「バケット」です。(およびその他のグローバルスコープ変数)

于 2009-10-01T23:56:32.683 に答える
2

静的クラスには、静的メンバーメソッドと静的メンバー変数/データのみが含まれます。静的データはパブリックまたはプライベートにすることができますが、データのコピーは1つだけであり、事実上グローバルです(ただし、アクセス範囲に制限がある場合があります)。静的メソッドは、プライベート静的データにアクセスできます。多くの場合、バッファー、初期化子、またはシングルトンリソースの制御ブロックの形式でアクセスできます。

通常、静的メソッドのみ(およびデータなし)の静的クラスは、内部状態を維持しないメソッド/関数のライブラリに使用されます。また、拡張メソッド。これらは通常、必要に応じて必要に応じて受け入れられますが、特に特別な方法でOOはありません。

(静的、もちろん、静的クラスに非静的データがない)データが静的クラスに追加された場合、関数は通常、自動的に再入可能またはスレッドセーフではありません-つまり、別々のスレッドで同じ関数を2回呼び出すと互いにステップするか、関数がコールバック/デリゲートなどを受け取り、同じ関数への以前の呼び出しが進行中に同じ関数を呼び出すことになった場合。

静的クラスと静的メソッドのみを使用すると、ほとんどのオブジェクト指向言語は、構造体や関数ポインターを作成せずに、CやPascalなどの従来の手続き型言語に近いものに効果的に崩壊します。

于 2009-10-02T00:06:25.423 に答える
1

Abby Fichtnerが指摘したように、不変のクラスはしばしば良いことです。

静的クラスはしばしば良いことではありません。DancesWithBambooが指摘したスレッドの問題は別として、クラスが不変でない場合はグローバルデータを処理していることになります。グローバル変数がたくさんあるプログラムをデバッグしようとしたことがありますか?

もう1つの問題は、妥当性です。静的クラスに結合された多くのクラスになってしまう可能性があります。ユニットテストの目的でその結合を解除することは困難です。静的メソッドは常に呼び出されます。

シングルトンは羊の服の世界的なデータにすぎません。それらは静的クラスやグローバル変数と同じ問題に悩まされています。

静的クラスには有効なユースケースがあります(拡張メソッドが思い浮かびます)。シングルトンでさえ彼らの場所を持っています。ただし、どちらかを実装する前に慎重に検討してください。

于 2009-10-02T01:27:08.177 に答える
0

あなたが何をしようとしているのか完全には理解できませんが、ここにいくつかの考えがあります:

1)静的クラスを(少なくとも直接)インスタンス化することはできないため、静的クラスのオブジェクトを作成することはできません。あなたの例では、アカウントのインスタンスを作成することはできません。これは、あなたの望むことですか?

2)静的クラスはインスタンス変数を持つことができず、静的変数のみを含むことができるため、この例では、ID、Durationなどのすべてのプロパティは静的である必要があります(アカウントにはお勧めできません)

3)費用:高価なリソースを共有する必要がある場合、静的変数を作成すると、そのタイプのすべてのインスタンス間で静的が共有されるため、シングルトンパターンを実装できます。通常、これは読み取り専用で、一度インスタンス化されます。このようなもの:

public class Singleton
{
    private static Singleton _instance = new Singleton();

    private Singleton() {}

    public static Singleton Instance {
        get {
                return _instance;
        }
    }
}

4)代わりに構造体を使用して軽量オブジェクトに実装できる不変性を探しているようです。

これがいくつかのガイダンスを提供することを願っています

于 2009-10-02T00:06:25.580 に答える
-2

私は専門家ではありませんが、プロパティが変更されない場合は、静的ではなく一定である必要があることを理解しています。

私の経験では、静的は、値の1つのインスタンスのみがアプリケーションに存在し、必要な機能ではあるもののOOP設計内では推奨されないことを示すために使用されます。

変更されないプロパティを持つクラスAccountがある場合、見ているのは不変クラスのシングルトンインスタンスです。staticキーワードを使用してこれを開発し、Accountクラスの1つのインスタンスのみをインスタンス化できるようにするか、またはプロパティを定数として宣言できます。

静的である必要のあるメソッドがたくさんある場合は、基本的に、オブジェクト指向ではないようにプログラムを設計しています。その時点で、オブジェクト指向以外のプログラミング言語を使用することを決定するのは良いことかもしれません。

マルチスレッドアプリケーションを使用している場合の大きな問題であるため、私は特に静的を軽蔑しています。

于 2009-10-01T23:55:10.610 に答える