在 .NET 中实现单例模式时是否使用属性或方法是否有任何约定?
我想不出任何好的理由来使用其中一个或另一个,除了一种方法可能在未来接受参数。
在 .NET 中实现单例模式时是否使用属性或方法是否有任何约定?
我想不出任何好的理由来使用其中一个或另一个,除了一种方法可能在未来接受参数。
文章在属性和方法之间进行选择对通用场景有一些很好的建议。问题是延迟初始化有点模糊了这个话题。
一方面,你有这些论据表明它可能是一个属性。
另一方面,您有这些论据表明它可能是一种方法。
我已经看到单例实现了两种方式。最后,您的决定不会对您的应用程序的其余部分产生巨大影响,因此这可能是一个没有实际意义的讨论。再说一次,如果这是您要公开的公共 API 的一部分,那么该决定确实具有一定的重要性。最主要的是考虑来电者将如何对您的决定作出反应。例如,大多数开发人员假设(通常不自觉地)属性是无异常的,所以如果你的单例创建可以抛出,那么最好有一个GetInstance()
方法。否则,拥有Instance
房产可能是更好的途径。
要考虑的另一件事是单例是否将用于 WPF 或 Silverlight 的 XAML 绑定。通常,您将公共属性绑定到 XAML 元素,因此在这种情况下,将您的单例实现为属性将是更好的路线,尽管方法方法有参数。
由于两个MSDN原因,您可以使用属性:-
这种实现有两个主要优点:
- 因为实例是在 Instance 属性方法中创建的,所以该类可以执行其他功能(例如,实例化子类),即使它可能会引入不受欢迎的依赖项。
- 在对象请求实例之前,不会执行实例化;这种方法 > 称为惰性实例化。延迟实例化可避免在应用程序启动时实例化不必要的单例。
通常,大多数 Singleton 的“标准化”示例都使用一个属性,其底层实例是通过Lazy<T>
.
鉴于单例通常只是返回一个实例,因此(仅获取)属性与预期非常匹配。