7

この質問(https://stackoverflow.com/questions/352317/c-coding-question#352327)に答えると、疑問に思いました...

静的クラスを、シングルトン パターンを実装する非静的クラスのインスタンス化と同等であると見なすことに危険はありますか?

4

8 に答える 8

10

すぐにわかる唯一のことは、静的クラスは基本的にスコープ関数の単なるコレクションであり (ここでは「メソッド」を明示的に回避しています)、シングルトンは 1 つしか持てなくてもインスタンス化できるものであるということです。 1 > 0.

特定のインターフェイスのオブジェクトを期待するものにシングルトンを引数として渡すことができますが、静的クラスをどこにも渡すことはできません (リフレクションのトリックを除く)。

于 2008-12-09T10:47:11.240 に答える
4

多くの点で、静的クラスとシングルトンは似ています。大きな違いの 1 つは、シングルトンがいくつかのインターフェイスを実装する可能性があることです。これは、静的クラスでは不可能です。たとえば、Comparer<T>.Default/EqualityComparer<T>.Defaultは (インターフェイスを介して) ソート/辞書の使用でアイテムを使用する機能を提供します。

標準のシリアライゼーション フレームワークでシングルトンを使用することもできます (注意が必要です)。静的クラスでは、状態の永続性を手動で管理する必要があります。

于 2008-12-09T11:01:25.237 に答える
2

正確には同等ではありません。たとえば、シングルトン インスタンスへの参照を引数として渡すことができますが、インスタンスがないため、静的クラスではこれを行うことができません。

「危険」とは何を意味しますか?

于 2008-12-09T10:41:08.910 に答える
1

ロバート・グールドが指摘したように、建設をコントロールできなくなります。また、はるかにあいまいな構造の問題も発生します。静的クラスはすぐに静的初期化ブロックになります。これらのブロックは、誰かがあなたの型を初めて参照したときに呼び出されます。この順序は、あなたが考えているほど明確に定義されていない可能性があります。したがって、これらの静的イニシャライザの実行順序は、計画せずに変更される可能性があり、奇妙なバグを引き起こす可能性があります。

于 2008-12-09T10:51:20.857 に答える
1

私が見ることができる静的クラスの主な危険性は、単体テストを作成するときにそれらをモックするのがはるかに難しいことです。シングルトンを使用すると、特定の機能をテストする別のクラスをその場所に挿入できるように作成できますが、静的クラスではこれはそれほど簡単ではありません。

于 2008-12-09T11:38:22.120 に答える
0

シングルトン実装のコンテキストでは、危険はないと思います。私はしばしば同じことを行い、静的クラスを介してシングルトーンを実装します。論理的には、オブジェクト参照が単独で一意である場合、オブジェクト参照は必要ありません。

于 2008-12-09T11:30:13.133 に答える
0

C# についてはわかりませんが、C++ では初期化時に静的オブジェクトが初期化され、それを直接制御することはできません (特にマルチスレッド アプリでは)。したがって、オブジェクトを直接呼び出すだけでなく、オブジェクトを呼び出す関数が必要です (移植できないコードが必要な場合を除く)。

于 2008-12-09T10:42:31.887 に答える
0

ロバートが前に言ったように、初期化は静的クラスの主な欠点です。静的クラスは通常、可能な限り最後の瞬間に遅延して初期化されます。ただし、正確な動作を制御できなくなり、静的コンストラクターは遅くなります。

多くの場合、静的クラスはグローバル データを保持するために使用されます。また、グローバル データは、他のオブジェクト / クラス間に暗黙の依存関係を作成します。したがって、この「グローバル オブジェクト」を変更するときは注意が必要です。アプリケーションが壊れる可能性があります。

于 2008-12-09T10:52:43.973 に答える