2012-01-19 54 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具有下面的代碼

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; 
     } 
    } 

我已經使用了RootFrame_Navigating()來檢查,如果我需要去到主頁面或登錄頁面。

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()

但調試向我表明強制的應用程序()constuctor後內Cyclemanager實例將被創建,控制流程進入到循環管理器類,並在CycleManager()構造函數後移動到RootFrame_Navigating。 !有什麼不對嗎,或者我瞭解它錯了嗎?

第二件事是在執行CycleManager pCycMan = CycleManager.instance;我期待CycleManager中的以下代碼被調用,但令人驚訝的是它沒有。那麼,單身財產如何管理?或每次創建一個新的obj?

public static CycleManager Instance 
    { 
     get 
     { 
      return instance; 
     } 

    } 

Alfah

+0

' CycleManager pCycMan = CycleManager.instance;'你的意思是'CycleManager.Instance'? – abhinav

回答

0

如果你看看C#規範static field initialization

[...]靜態字段初始正以 實現相關的時間第一次使用之前執行的靜態字段

因此,您的b命中的reakpoints符合規範,換言之,靜態字段在由運行時確定的某個時間初始化。但是,確切的時間不詳細。你不應該編寫依賴於靜態字段初始化順序的代碼。

您的第二個問題是您正在訪問該字段,而不是屬性instanceInstance。你應該讓你的靜態字段保密。

+0

感謝:D我意識到,即時通訊只有在閱讀後才能訪問「財產」:D。幸運的是,它被宣佈爲靜態的,因此我可以在任何地方訪問! :D新手錯誤:D – alfah

1

你實際上並沒有在你的RootFrame_Navigating方法中訪問get屬性。你直接擊中靜態字段(它被聲明爲public)

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

...

CycleManager pCycMan = CycleManager.instance; 

我想你想鍵入CycleManager.Instance(大寫的 'I')

+0

是的,我在這裏犯了一個巨大的概念錯誤! :D謝謝..我已經宣佈實例爲public,並作爲CycleManager.instance而不是cycleManager.Instance在任何地方訪問它。 。 – alfah