【问题标题】:Control flow in a windows appWindows 应用程序中的控制流
【发布时间】:2012-01-19 14:01:51
【问题描述】:

我的应用有一个名为 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() 构造函数之后,控制流移动到 Cycle 管理器类,在 CycleManager() 构造函数之后,它移动到 RootFrame_Navigating。 !!有什么不对还是我理解错了?

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

    public static CycleManager Instance
    {
        get
        {
            return instance;
        }

    }

阿尔法

【问题讨论】:

  • CycleManager pCycMan = CycleManager.instance; 你的意思是CycleManager.Instance 吗?

标签: windows-phone-7 navigation singleton app.xaml


【解决方案1】:

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

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

...

CycleManager pCycMan = CycleManager.instance;

我认为您的意思是输入CycleManager.Instance(大写“i”)

【讨论】:

  • 是的,我在这里犯了一个巨大的概念错误! :D 谢谢。 .
【解决方案2】:

如果您查看 static field initialization 的 C# 规范

[...] 静态字段初始化器在 首次使用静态字段之前与实现相关的时间 那个班的

因此,您的断点被命中的顺序符合规范,换句话说,静态字段在运行时确定的某个时间初始化。不过,具体时间不详。您不应该编写依赖于静态字段初始化顺序的代码。

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

【讨论】:

  • 谢谢:D 我意识到只有在您阅读帖子后我才访问“属性”:D。幸运的是,因为它被宣布为公共静态,因此我可以在任何地方访问它! :D 新手错误 :D
猜你喜欢
  • 2011-08-10
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
相关资源
最近更新 更多