我的应用程序有一个名为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()构造之后的jus,控制流移动到Cycle管理器类,在CycleManager()构造函数之后移动到RootFrame_Navigating。 !有什么不对或我理解错了吗?
第二件事是在执行CycleManager pCycMan = CycleManager.instance;
时我预计会调用CycleManager中的以下代码,但令人惊讶的是它不是。那么singleton属性如何管理?或者每次创建新的obj?
public static CycleManager Instance
{
get
{
return instance;
}
}
Alfah
答案 0 :(得分:1)
您实际上并未在RootFrame_Navigating方法中访问get属性。你直接命中静态字段(它被声明为public)
public sealed class CycleManager
{
public static readonly CycleManager instance = new CycleManager();
...
CycleManager pCycMan = CycleManager.instance;
我认为您打算键入CycleManager.Instance
(使用大写'i')
答案 1 :(得分:0)
如果查看static field initialization
的C#规范[...]静态字段初始值设定项在a处执行 在第一次使用静态字段之前依赖于实现的时间 那个班级
因此,命中断点的顺序与规范一致,换句话说,静态字段在运行时确定的某个时间初始化。但是,确切的时间并不详细。您不应该编写依赖于静态字段的初始化顺序的代码。
您的第二个问题是您正在访问该字段,而不是属性instance
与Instance
。您应该将静态字段设为私有。