【问题标题】:How is UWP main App singleton implemented?UWP主App单例是如何实现的?
【发布时间】:2021-07-20 11:32:08
【问题描述】:

关于单例实现的其他问题的答案表明构造函数对于单例类应该是私有的。但是从Windows.UI.Xaml.Application 派生的UWP 主App 单例类有一个公共构造函数。 VS为其生成的XML文档说:

/// <summary>
/// Initializes the singleton application object.  This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>

当我尝试在鼠标事件上创建第二个实例时,我得到了

灾难性故障(HRESULT 异常:0x8000FFFF (E_UNEXPECTED))

那么为什么构造函数是公开的,以及如何实现单例以强制只存在一个 App 实例?

【问题讨论】:

    标签: c# uwp


    【解决方案1】:

    单例模式

    单例设计模式将类的实例化限制为一个实例。如何实现这一点不是由模式本身定义的,因为模式独立于编程语言。你可以例如使用 .Instance 属性或 .GetInstance() 方法 - 甚至可以随意命名,这可能会使人们感到困惑,但它仍然是单例。

    使用私有构造函数似乎是一个好习惯,因为它很有帮助,因为它会在尝试使用私有构造函数时产生编译器错误。但是:有些编程语言甚至没有 private 关键字。

    显然,UWP 选择限制实例数量的方式会在运行时引发异常。

    实施

    查看调用堆栈,灾难性故障发生在

    at Windows.UI.Xaml.Application..ctor()
    at UWP.App..ctor() in ...\App.xaml.cs:line 29
    at UWP.App.OnLaunched(LaunchActivatedEventArgs e) in ...\App.xaml.cs:line 43
    

    所以 App 类的构造函数调用基类构造函数抛出异常。由于Windows.UI.Xaml.dll 不是 .NET DLL,我无法使用 dotPeek 或 dnSpy 查看它。

    【讨论】:

      猜你喜欢
      • 2013-07-16
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 2012-10-25
      • 2021-11-25
      • 2017-02-10
      • 2017-04-08
      相关资源
      最近更新 更多