3

在 .NET 中实现单例模式时是否使用属性或方法是否有任何约定?

我想不出任何好的理由来使用其中一个或另一个,除了一种方法可能在未来接受参数。

4

3 回答 3

2

文章在属性和方法之间进行选择对通用场景有一些很好的建议。问题是延迟初始化有点模糊了这个话题。

一方面,你有这些论据表明它可能是一个属性。

  • 单例只是一段数据。
  • 延迟初始化不符合可观察到的副作用。他们在这里的关键词是“可观察的”。换句话说,单例是刚刚创建或已经创建的事实,是从调用者的角度封装的。

另一方面,您有这些论据表明它可能是一种方法。

  • 需要复杂初始化的单例可能非常耗时。一般来说,耗时的操作被实现为方法。
  • 如果单例创建可能会引发瞬态异常(数据库连接、网络上的文件操作等),那么如果使用一种方法来代替,一些调用者可能会更好地理解它。

我已经看到单例实现了两种方式。最后,您的决定不会对您的应用程序的其余部分产生巨大影响,因此这可能是一个没有实际意义的讨论。再说一次,如果这是您要公开的公共 API 的一部分,那么该决定确实具有一定的重要性。最主要的是考虑来电者将如何对您的决定作出反应。例如,大多数开发人员假设(通常不自觉地)属性是无异常的,所以如果你的单例创建可以抛出,那么最好有一个GetInstance()方法。否则,拥有Instance房产可能是更好的途径。

要考虑的另一件事是单例是否将用于 WPF 或 Silverlight 的 XAML 绑定。通常,您将公共属性绑定到 XAML 元素,因此在这种情况下,将您的单例实现为属性将是更好的路线,尽管方法方法有参数。

于 2013-09-16T19:59:34.277 回答
1

由于两个MSDN原因,您可以使用属性:-

这种实现有两个主要优点:

  • 因为实例是在 Instance 属性方法中创建的,所以该类可以执行其他功能(例如,实例化子类),即使它可能会引入不受欢迎的依赖项。
  • 在对象请求实例之前,不会执行实例化;这种方法 > 称为惰性实例化。延迟实例化可避免在应用程序启动时实例化不必要的单例。
于 2013-09-16T19:13:50.180 回答
1

通常,大多数 Singleton 的“标准化”示例都使用一个属性,其底层实例是通过Lazy<T>.

鉴于单例通常只是返回一个实例,因此(仅获取)属性与预期非常匹配。

于 2013-09-16T19:11:07.330 回答