2011-08-08 4 views
2

私は、特定のオブジェクトを操作するプログラムを作成しています。それらを「単語」と呼んでいます。各単語は、いくつかのクラスの1つのインスタンスです。一度にたくさんあります。オブジェクトへのC#データファイル

これらのWordオブジェクトはそれぞれ、XMLファイルに格納された辞書にアクセスする必要があります。私はWordの各オブジェクトがXMLファイルを別々にロードする必要があるとは思わない。 Wordオブジェクトは、プログラムデータの一部のグローバルプールにアクセスできる必要があります。

これに対処する最も良い方法は何ですか? XML文書を含むProgramDataというクラスを作成し、作成時にすべてのWordオブジェクトに渡す必要がありますか?これにより、XMLファイルの複数のインスタンスがメモリにロードされることはありませんか? ProgramDataをすべての新しいオブジェクトに渡すことなく、私がやりたいことをやり遂げることはできますか?

答えて

2

ProgramDataの1つのインスタンスにXMLファイルをロードし、そのインスタンスを各Wordインスタンス(おそらくコンストラクタ内)に渡す必要があります。 Wordクラスの静的プロパティを作成してからWordのインスタンスを開始することもできますが、スレッドの安全性を確保するためには必ずlockを使用してください。

あなたの代案はSingleton patternですが、信頼してください、あなたはdon't want to go down that roadです。

編集:だけ明確にすること、これが最初のオプション(私が使用したい1)である。

public class Word 
{ 
    private ProgramData _Data 
    public Word(ProgramData data) 
    { 
     _Data = data; 
    } 

    public void MethodThatUsesData 
    { 
     // _Data.TryGetValue() 
    } 
} 

// in your main method or initialization routine: 
ProgramData data = MethodThatLoadsData(); 
Word w = new Word(data); 
+0

なぜロックが必要ですか? OPのコードはシングルスレッドであり、使用する前に静的プロパティを設定することができます。また、ロックは現在OPのレベルを上回っている可能性があります。 – KyleM

+0

私はシングルスレッド性については想定していませんし、OPsは適切なロック構造を使用する技術的能力も有していません。それがセットアンドフォールトになるならば、ロックは必要ではないかもしれませんが、それは彼/彼女が考慮すべきものです。 – drharris

+1

十分に公正です。言い換えると、私の前のコメントは主に、静的なプロパティを最初に設定するだけで十分であることをOPに通知することでした。もしそうなら、スレッドの安全性やロックについて心配する必要はありません。それをノックしようとしていません、あなたの返信に+1。 :) – KyleM

1

あなたはProgramDataクラスは、XmlDocumentオブジェクトの静的変数を持つことができますので、あなたはありません変数をコンストラクタに渡す。あなたの他のクラスはProgramData.YourVariableを参照するだけです。

他の質問に答えるために、この方法ではXMLファイルの複数のインスタンスがメモリに読み込まれることはなく、drharrisのアプローチにもなりません。

また、この情報はC#だけでなく、すべてのオブジェクト指向プログラミング言語(少なくとも私が認識しているもの)に適用されることに注意してください。 myMethod()というメソッドで一度だけXML文書をメモリにロードすると、myMethod()は一度呼び出されますが、XML文書は一度メモリにロードされます。あなたがコード化されたものだけ、または別の開発者がコード化したもの(およびあなたが直接的または間接的に呼び出されたもの)が起こります。魔法はありません。

関連する問題