2012-01-19 23 views
0

My appには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; 
     } 
    } 

次のコードを持っていますメインページまたはログインページに移動します。

私はインスタンスがRootFrame_Navigating(内部で呼び出されたときにCyclemanagerインスタンスが作成されることを期待していた
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)); 
     }); 
    } 

しかし、デバッグは、アプリケーション()constuctor後に私への制御フローの動きをそのジュースを示しましたCycleManagerクラスを作成し、CycleManager()コンストラクタの後にRootFrame_Navigatingに移動します。 !!何か間違っているか、間違っていると私は理解していますか?

第2のことは、CycleManager pCycMan = CycleManager.instance;の実行時です。CycleManagerの次のコードが呼び出されていると思いますが、驚くことではありません。次に、シングルトンプロパティはどのように管理されますか?または毎回新しいobjが作成されますか?

public static CycleManager Instance 
    { 
     get 
     { 
      return instance; 
     } 

    } 

Alfah

+0

' CycleManager pCycMan = CycleManager.instance; 'CycleManager.Instance'を意味しますか? – abhinav

答えて

0

あなたはstatic field initialization

のためのC#の仕様を見れば[...]静的フィールド初期化子が最初の使用前に 実装依存時に実行されています静的フィールドの

したがって、あなたのb reakpointsがヒットすると、仕様とインラインであり、言い換えれば、スタティックフィールドはランタイムによって決められたある時点で初期化されます。ただし、正確なタイミングは詳細ではありません。静的フィールドの初期化順序に依存するコードを記述しないでください。

2番目の問題は、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ありがとう..私はインスタンスをpublicとして宣言し、cycleManager.InstanceではなくCycleManager.instanceとしてどこにでもアクセスしていました。 。 – alfah

関連する問題