クラスという機能があります。宣言したクラスのインスタンスが複数作成できないようにできます。この機能、デザインパターンにあるシングルトンと何か違うのでしょうか?ちょっと考察してみました。言語上でどういう風に表現されるか見ていきたいと思います。...こうすることによってこのクラスの新規作成、インスタンスメンバーの保持を禁止することができます。GlobalDataByStaticClass();}また、staticクラスは継承元として使えず、ほかのクラスが継承することもできません。ちなみに、UMLでstaticクラス表記するとこんな感じになります。(全部staticメンバーになるので下線が全てにつきます)staticクラスの概念は<>ステレオタイプで表現します。上記クラス図のC#の実装は以下の通ようになります。}}但し、このままでは値が設定されないので値を設定するためのメソッドを自分自身に用意するか、他人に設定してもらう必要があります。以下の例ではアプリケーションの横断的な関心を管理するためのクラス「ApplicationCoordinator」を追加してGlobalDataByStaticClassの各メンバーの値を設定しています。SingletonクラスGoFのデザインパターンで出てくるシングルトンパターンですが、C#で記述すると以下の様になります。プロパティを用いてインスタンスを取得する下の表記のほうがよりc#っぽいです。いうわけで、後述の場合のシングルトンのC#の実装は以下の通りです。}}この例では、初回アクセス時にインスタンスが無ければ作成しています。違うのか?staticクラスとSingletonでは以下の違いがあります。staticクラスに比べると多い上記の特性を考慮し、データを読み書きする場合、プロセス中で必ず唯一のデータを扱える。いう意味で利用感は全く同じですが、シングルトンは派生クラスによってメソッドをオーバーライドできるので、テストのときにダミーデータ応答をするテストオブジェクトに差し替えるなど柔軟な対応が可能です。staticクラスの場合、ほぼ一瞬で実装が完了するので大変軽いのですが、C言語時代にあったグローバル変数と同じで、派生クラスによる差し替えもできないため実装がシングルトンに比べ固くなります。局所的なデータ共有や、すぐさま実装する場合はstaticクラス、可用性や実装の柔らかさを確保したいときはシングルトンという利用イメージでほぼ間違いないと思います。staticクラスでデータ共有する場合は、フィールド生公開ではなく必ずプロパティでくるむかアクセサ経由にしましょう。4;}staticクラスの欠点で、実際に運用を始めたときに特に違いがでるのが、自動テストを通す局面だったりします。staticクラスの場合、クラス内でメンバーの初期化を行うとテスト時、本番時の区別が出来ない(値を状況によって変更できない)ため外部からデバッグの値の設定と本番時の値を設定する側が書き分ける必要が出てきます。以下例ではApplicationCoordinatorの値のロード操作をもつインターフェースクラスIApplicationCoordinatorをあたらに追加してテスト用データをロード設定するためのTestContext、実行状況によりどちらのインスタンスを使うのかを定めるFactoryを追加し利用します。この構成をstaticクラスを作るたびに作っているとかなり手間です。Sinsletonは書関『レガシーコード改善ガイド』のP138によればコンストラクタをprotectedへ変更してstaticなインスタンス変更メソッドを追加し柔軟性を出すことができます。この場合、テスト時は初期化の段階でTextContextを作成し、任意の値を設定した後にSetInstansへテストデータを与え処理を実行します。»Profile受託ソフト会社員でWin系業務屋。趣味でCocos2d-x/C++を触っています。etc...主に受託・開発ネタ、Windowsの事、Srellaris、ゲーム制作の進捗の事を喋ります。Core3.xとUnityでAES暗号化を利用するC#の標準機能でデータを圧縮・展開するC#で属性を利用して処理に制約の説明を追加するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。