c# - 静态属性和单例有什么区别?

标签 c# design-patterns

用 C# 实现的单例可能是这样的:

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}

如果我使用 static 来实现它:

public static class Globals{
  public static Singleton Instance = new Singleton();
}

这样一来,应用程序也应该只获取整个应用程序的一个实例。 那么这两种方法有什么区别呢?为什么不直接使用静态成员(更简单直接)?

最佳答案

如果你使用第二种方法:

public static class Globals{
  public static Singleton Instance = new Singleton();
}

没有什么能阻止某人做:

Singleton anotherInstance = new Singleton(); // Violates singleton rules

您也不会获得与您的第一个版本(尝试)实现的相同的延迟初始化,而且您使用的是公共(public)字段,如果您需要更改发生的事情,这将不允许您在未来获得相同的灵 active 获取值时。

请注意,.NET 4 提供了一种可能更好的方法来创建单例:

public class Singleton
{
   private static readonly Lazy<Singleton> instance = new Lazy<Singleton>( ()=> new Singleton());

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         return instance.Value;
      }
   }
}

这很好,因为它是完全惰性的完全线程安全的,但也很简单。

关于c# - 静态属性和单例有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12678305/

相关文章:

c# - Web API 2 REST 服务高级数据过滤

c# - 解释 C# 中的语句

c# - 访问模型时出现 ASP.NET Core NullReferenceException

java - 什么时候使用 instanceof 才是正确的决定?

c# - 开始使用 MVC 创建大型 C# 应用程序的最佳方法是什么?

c# - 如何使用 DocX 在 Word 文档中插入换行符?

c# - C#/软件中的端口转发可能吗?不是只能由路由器管理吗?

java - 使用带参数的命令模式

c++ - 为什么总是在 std::for_each 中指定迭代器?

php - 如何在 PHP 中自动绑定(bind)实现?