2013-04-17 3 views
3

WPF에서 윈도우에 대한 싱글 톤 객체 생성을 검색했습니다.어떻게 창에 싱글턴 인스턴스를 만들 수 있습니까?

public static Test DefInstance 
{ 
    get 
    { 
     if (formDefInstance == null) // formDefInstance.IsDisposed 
     { 
      initializingDefInstance = true; 
      formDefInstance = new cas18(); 
      initializingDefInstance = false; 
     } 
     return formDefInstance; 
    } 
    set { formDefInstance = value; } 
} 

그러나 forDefInstance.IsDisposed 작동 및 오류를 던지고되지 않습니다.

어떤 아이디어가 있습니까?

+3

이 질문을 downvote 할 이유가 없습니다. 코드 샘플에서 그가하고 싶은 일이 꽤 명확합니다. 그는 창을 한 번만 열려고하지만 창을 닫았는지 여부도 감지하려고합니다. 그런 다음 다시 열 수는 있지만 화면에 두 개의 창이 동시에 없어야합니다. 사실 꽤 재미있는 질문이라고 생각합니다! –

+3

@ThorstenDittmar : 나는 downvoted 사람이 아니었지만 "... 작동하지 않고 오류를 던지고있다"* 오류 메시지를 포함하지 않고 * downvoted 요청하는 것입니다. – Heinzi

+1

@Heinzi 질문이 완전하지는 않지만 이것이 사실이지만, 나는 downvote를받을 가치가 있다고 생각하지 않는다. @ OP 오류 메시지를 추가하십시오. – ken2k

답변

0

당신이 원하는 무엇하지만 나를 위해 작동하는지 모르겠어요 :

private static MyWindow _defInstance; 
public static MyWindow DefInstance 
{ 
    get 
    { 
     if (null == _defInstance) 
     { 
      _defInstance = new MyWindow(); 
     } 
     return _defInstance; 
    } 
} 

MyWindow 코드에서 :

protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
{ 
    this.Visibility = Visibility.Hidden; 
    e.Cancel = true; 
} 

그것을 사용하려면 :

DefInstance.Show(); 

그런 다음 단 하나의 창이 표시되고 하나의 창 인스턴스를 사용합니다.

-2

당신은

private static volatile DefInstance instance; 
private static object syncRoot = new Object(); 

private DefInstance() {} 

public static DefInstance Instance 
{ 
    get 
    { 
     if (instance == null) 
     { 
     lock (syncRoot) 
     { 
      if (instance == null) 
       instance = new DefInstance(); 
     } 
     } 

     return instance; 
    } 
} 
+0

와우! 왜 휘발성인가? 싱글 톤의 목적은 한 번 생성하여 후속 인스턴스 생성을 방지하는 것입니다.'volatile' 키워드는 하나 이상의 후속 인스턴스를 생성하고 그것을'DefInstance'에 할당하는 것을 가능하게합니다. 대신에'readonly'를 사용하십시오. – code4life

+0

변수가 volatile로 선언되어 인스턴스 변수에 액세스하기 전에 인스턴스 변수에 대한 할당이 완료됩니다. –

+1

private static 읽기 전용 DefInstance 인스턴스 = new DefInstance() 스레드 안전성과 액세스 가능성을 보장하고 후속 쓰기를 방지합니다. '휘발성'은 그렇지 않다. – code4life

0

내가 모두가 깊이 사이트에서 존 소총의 C#을 살펴한다고 생각 다음과 같은 방법을 구현하여이 작업을 수행 할 수 있습니다. 오직 그들의 뇌에 독서와 영구적으로 화상을 입히려면 C# 싱글 패턴. 시나리오에서

http://csharpindepth.com/Articles/General/Singleton.aspx

이 (스레드 안전, 비 지연)를 구현하려고 :

Lazy<T> implementions 및 해당 사이트의 패턴의 다양한 다른 구현도 있습니다
public sealed class DefInstance 
{ 
    private static readonly DefInstance instance = new DefInstance(); 
    static DefInstance() 
    { 
    } 

    private DefInstance() 
    { 
    } 

    public static DefInstance Instance 
    { 
    get 
    { 
     return instance; 
    } 
    } 
} 

.

관련 문제