在windows应用程序中控制流



我的应用程序有一个名为CycleManager的单例类。我已经为此创建了一个密封类,比如这个

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()内部调用实例时,会创建Cyclemanager实例

但调试告诉我,在App()构造函数之后,控制流会移动到CycleManager类,在CycleManager()构造函数后,它会移动到RootFrame_Navigating!!是出了什么问题,还是我理解错了?

第二件事是,在执行CycleManager pCycMan = CycleManager.instance;时,我预计CycleManager中的以下代码会被调用,但令人惊讶的是,它没有被调用。那么singleton属性是如何管理的呢?还是每次创建新对象时?

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

阿尔法

您实际上并没有访问RootFrame_Navigating方法中的get属性。你直接击中了静态字段(它被宣布为公共)

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

CycleManager pCycMan = CycleManager.instance;

我想你是想键入CycleManager.Instance(大写'I')

如果您查看静态字段初始化的C#规范

[…]静态字段初始化程序在首次使用静态字段之前的实现相关时间

因此,断点的命中顺序与规范一致,换句话说,静态字段在运行时确定的某个时间初始化。然而,具体时间没有详细说明。您不应该编写依赖于静态字段初始化顺序的代码。

第二个问题是,您访问的是字段,而不是属性instanceInstance。您应该将静态字段设为私有字段。

最新更新