2011-11-22 11 views
0

아래에 설명 된 것처럼 두 개의 정적 객체간에 객체의 인스턴스를 공유해야합니다. 처음으로 속성을 호출하면 MyPropertyMyObject을 인스턴스화해야합니다.정적 생성자 및 공유 데이터

영리한 독자로서, 당신은 버그를 발견했습니다. 처음으로 First을 사용할 때 MyProperty을 인스턴스화하고 Second을 처음 사용할 때 MyProperty을 인스턴스화합니다. 그것은 다시 초기화되고이 객체의 모든 상태가 느슨합니다. 냄새 거기에 나를 위해,

static Second() 
{ 
    if(MyProperty == null) MyProperty = new MyObject(); 
} 

그러나 :

public static class First 
{ 
    static First() { MyProperty = new MyObject(); } 
    public static MyProperty{ get; set; } 
} 

public static class Second 
{ 
    static Second() { MyProperty = new MyObject(); } 
    public static MyProperty 
    { 
     get { return First.MyProperty; } 
     set { First.MyProperty= value; } 
    } 
} 

이 경우 해결책은 무효를 확인하는 것입니다. 나는 나쁜 코드의 느낌을 가지고있다. 그래서 거기에 내 질문 : 패턴 또는 두 가지 정적 개체간에 컨텍스트를 공유하는 좋은 조언이 있습니까?

+0

왜 '정적'을 사용하고 있습니까? 그것은 이런 꼴을 만듭니다. –

+0

"냄새"는 아직 다루지 않습니다 :) 당신이 요구하는 행동의 배경이 없으면 ('정적'이 현재의 해결책입니다) 좋은 대답을 얻는 것은 까다 롭습니다. 왜 First와 Second 둘 다 정적 일 필요가 있으며 왜 인스턴스 유형의 동일한 참조를 참조해야합니까? –

+0

응용 프로그램의 다른 부분간에 공유 된 컨텍스트입니다. –

답변

1

라고 패턴이 없음 Second을 통해 또는 "직접"문제가됩니다. 그러나 Daniel이 언급했듯이 인스턴스 사용을 고려할 수 있습니다. Stateful statics는 냄새도 나눕니다.

대안으로 생성자가 MyObjectFactory을 생성하는 것으로 간주 할 수 있습니다. 이 팩토리는 FirstSecond 인스턴스를 구축하는 두 가지 방법을 제공하며 여기에는 MyObject이 전달됩니다. 정적 클래스에 액세스하는 대신 인스턴스를 전달해야합니다. 정적 클래스는 편리하지 않습니다.

+0

예, 맞습니다! 처음에는 그 점을 알아 내기가 너무 어려웠습니다. 고맙습니다! –

1

예 - First.MyProperty이 바로이 액세스로 First에 의해 초기화되기 때문에, 그것은, 싱글

확인 당신은 Second 생성자가 필요하지 않습니다 여기에 5 솔루션 http://www.yoda.arachsys.com/csharp/singleton.html

+2

.NET 4.0, 사람들은 단지 정적 인 게으름을 사용해야합니다.

-1
public static class First 
{ 
    private Static MyObject _myproperty; 
    static First() {} 
    public static MyProperty 
    { 
     get 
     { 
      if(_myproperty == null) _myproperty = new MyObject(); 
      return _myproperty; 
     } 
     set { _myproperty = value; } 
    } 
} 

public static class Second 
{ 
    static Second() {} 
    public static MyProperty 
    { 
     get { return First.MyProperty; } 
     set { First.MyProperty= value; } 
    } 
} 

정말로이 방법을 사용하고 싶다면. 하지만 ... 처음에는 접근하지 않으세요. 나를 위해 그것은 First를 통해 Second에 접근하는 것이 잘못되었습니다.

+0

@ -1Guy는 의견을 남겨 주셔서 감사합니다 .... –

+0

나는 -1 사람이 아닙니다. 그러나이 구현은 스레드로부터 안전하지 않다는 점을 지적하고자합니다. 이것은 물론 괜찮을 수 있습니다. 만약 늦은 초기화가 중요하고'MyProperty'가 접근 될 첫번째 속성이 아니라면, Interlocked 클래스는 필요하다면 thread safe (그리고 lock-free I guess) 방식으로'_myproperty' 값을 교환하는 것을 도와줍니다. –

관련 문제