2011-08-08 4 views
2

특정 개체를 조작하는 프로그램을 작성 중이며 "단어"라고 부릅니다. 각 단어는 여러 클래스 중 하나의 인스턴스입니다. 한 번에 많은 것들이있을 수 있습니다.개체에 대한 C# 데이터 파일

이러한 Word 개체 각각은 XML 파일에 저장된 사전에 대한 액세스가 필요합니다. 나는 각 Word 객체가 XML 파일을 개별적으로로드해야한다고 생각하지 않는다. Word 개체는 프로그램 데이터의 일부 전역 풀에 액세스 할 수 있어야합니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? XML 문서가 포함 된 ProgramData라는 클래스가 있어야하며 모든 Word 개체가 만들어 질 때 전달됩니다. XML 파일의 여러 인스턴스가 메모리에로드되지 않습니다. ProgramData를 모든 새 객체에 전달하지 않고 내가하고 싶은 일을 할 수 있습니까?

답변

2

XML 파일을 ProgramData의 한 인스턴스로로드 한 다음 해당 인스턴스를 각 Word 인스턴스 (어쩌면 생성자에서)로 전달해야합니다. Word을 인스턴스화하기 전에 설정 한 Word 클래스의 정적 속성을 만들 수도 있지만 스레드 안전성을 위해 lock ing을 사용해야합니다.

귀하의 대안은 Singleton pattern이지만, 나를 믿으십시오, don't want to go down that road.

편집 :

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

나는 single-threadedness에 대한 어떠한 가정도하지 않으며 OPs는 적절한 잠금 구조를 사용하는 기술적 능력도 가지고 있지 않습니다. 그것이 세트 앤 포겟 (set-and-forget) 일 경우, 잠금은 요구되지 않을 수도 있지만, 그/그녀가 고려해야 할 사항입니다. – drharris

+1

충분합니다. 다시 말하자면, 이전의 코멘트는 주로 정적 속성을 설정하는 것으로 충분 함을 OP에게 알리는 것이 었습니다. 그렇다면 스레드 안전 또는 잠금에 대해 걱정할 필요가 없습니다. 그것을 두드리지 않으려 고 답장을 +1하십시오. :) – KyleM

1

귀하의 경우 ProgramData 클래스가 된 XmlDocument에 대한 정적 변수를 가질 수 있고, 따라서 당신이되지 않습니다,이 첫 번째 옵션 (내가 사용하려는 사람은) 그냥 명확하게하는 것입니다 변수를 생성자를 통해 전달하는 것; 다른 클래스는 ProgramData.YourVariable을 참조 할 수 있습니다.

다른 질문에 대답하려면 XML 파일의 여러 인스턴스가 메모리에로드되지 않으며 drharris의 접근 방식도 적용되지 않습니다.

또한이 정보는 C#뿐 아니라 모든 객체 지향 프로그래밍 언어 (적어도 알고있는 지식)에 적용된다는 점을 명심하십시오. myMethod()라는 메서드에서 XML 문서를 메모리에 한 번로드하면 myMethod()는 한 번만 호출됩니다.이 XML 문서는 메모리에 한 번만로드됩니다. 코드화 된 코드 만 발생하거나 다른 개발자가 코딩 한 것 (직접 호출 또는 간접 호출)이 발생합니다. 마술은 없습니다.

관련 문제