2012-01-19 2 views
0

내 응용 프로그램에는 CycleManager라는 단일 클래스가 있습니다. 나는이Windows 응용 프로그램의 제어 흐름

public sealed class CycleManager 
{ 
    public static readonly CycleManager instance = new CycleManager(); 

    public CycleManager() 
    { 
     //ReadFromIsolatedStorage(); 
    } 

    public static CycleManager Instance 
    { 
     get 
     { 
      return instance; 
     } 

    } 
} 

같은이 목적을 위해 봉인 된 클래스를 만들었습니다 그리고 App.xaml.cs를 내가 갈 필요가 있는지 확인하기 위해 RootFrame_Navigating()를 사용했다

public App() 
    { 
     UnhandledException += Application_UnhandledException; 

     InitializeComponent(); 

     InitializePhoneApplication(); 

     RootFrame.Navigating += new NavigatingCancelEventHandler(RootFrame_Navigating);   if (System.Diagnostics.Debugger.IsAttached) 
     { 
      Application.Current.Host.Settings.EnableFrameRateCounter = true; 

      PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; 
     } 
    } 

다음과 같은 코드가 있습니다 메인 페이지 또는 로그인 페이지로 이동하십시오.

void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e) 
    { 
     //throw new NotImplementedException(); 
     if (e.Uri.ToString().Contains("/RootPage.xaml") != true) 
      return; 

     CycleManager pCycMan = CycleManager.instance; 

     e.Cancel = true; 
     RootFrame.Dispatcher.BeginInvoke(delegate 
     { 
      if (pCycMan.GetPasswordEnabled()) 
       RootFrame.Navigate(new Uri("/PasswordPage.xaml", UriKind.Relative)); 
      else 
       RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); 
     }); 
    } 

가 나는 인스턴스가 RootFrame_Navigating()

그러나 디버깅 앱() constructor에 후 나에게 그 나타나서을 보였다 내부에서 호출 될 때 Cyclemanager의 인스턴스가 생성 될 것으로 예상했다받는 제어 흐름으로 이동 CycleManager 클래스를 만들고 CycleManager() 생성자 다음에 RootFrame_Navigating으로 이동합니다. !! !! 뭔가 잘못되었거나 잘못 이해 했습니까?

두 번째 것은 CycleManager pCycMan = CycleManager.instance;을 실행하는 것입니다. CycleManager에서 다음 코드가 호출되는 것이 예상되지만 놀랍게도 isnt입니다. 그러면 싱글 톤 속성은 어떻게 관리됩니까? 또는 매번 새로운 obj가 생성됩니까?

public static CycleManager Instance 
    { 
     get 
     { 
      return instance; 
     } 

    } 

Alfah

+0

' CycleManager pCycMan = CycleManager.instance;'CycleManager.Instance'를 의미합니까? – abhinav

답변

0

당신은 static field initialization의 C#을 사양 보면

[...] 정적 필드 초기화 전에 처음 사용에 구현에 의존 한 번에 실행됩니다 정적 필드의 해당 클래스의

그래서 reakpoints가 명세에 맞으면, 즉 정적 필드는 런타임에 의해 결정되는 어떤 시간에 초기화된다. 그러나 정확한 타이밍은 상세하지 않습니다. 정적 필드의 초기화 순서에 의존하는 코드를 작성하면 안됩니다.

두 번째 문제는 속성 instanceInstance 대신 필드에 액세스하는 것입니다. 정적 필드를 비공개로 설정해야합니다.

+0

감사합니다 : 나는 당신의 독서 게시물 이후에만 '재산'에 액세스하는 것을 깨달았습니다. D. 운 좋게도 public static으로 선언되었으므로 어디에서나 접근 할 수있었습니다! : D 초보자 오류 : D – alfah

1

RootFrame_Navigating 메서드에서 get 속성에 실제로 액세스하지 않습니다. 사용자가 직접 정적 필드 (이 공개 선언)

public sealed class CycleManager 
{ 
    public static readonly CycleManager instance = new CycleManager(); 

...

CycleManager pCycMan = CycleManager.instance; 

당신이 CycleManager.Instance 입력하는 의미 생각 치는 것 (자본금을 'I')

+0

그래, 나는 거대한 개념상의 오류를 여기에서 만들었다! : D thanks .. 나는 public으로 선언했고 cycleManager.instance가 아닌 CycleManager.instance로 도처에 접근했다. . – alfah