【问题标题】:Singleton Class in c#c#中的单例类
【发布时间】:2018-08-17 12:08:22
【问题描述】:

我正在尝试理解 C# 中的单例模式。我为此得到了 1 个结构,但我对实施有一些疑问。由于我是 C# 新手,我想知道它是如何工作的。

public class Class1
{
    public static void Main(string[] args)
    {      
        Singleton.Object.Func1();
    }
}

public sealed class Singleton
{
    private static readonly Singleton _obj = new Singleton();

    static Singleton() { } // Make sure it's truly lazy

    private Singleton() { } // Prevent instantiation outside

    public static Singleton Object { get { return _obj; } }

    public void Func1() { }
}
  1. 这种模式对于单例类是否正确?

  2. 这行“static Singleton() { } // 确保它真的是惰性的”的目的是什么

  3. 类如何识别在特定时间只创建一个实例

【问题讨论】:

  • static Singleton() { } // Make sure it's truly lazy 没有意义,可以删除。它一无所获。对于 1 - 是的,它是正确的。 还有其他方法可以做到这一点,但这很好。
  • private Singleton() { } // Prevent instantiation outside 是如何解决 3 的。由于没有 public 构造函数,因此没有外部代码可以实例化它。因此它只能是obj 之一。
  • static 表示该类本身只会为其保存一个变量,因此无论何时/何地抓取它,只要该变量仍然存在,它就会抓取 smae 一个
  • Static keyword in c#的可能重复
  • 我推荐你阅读这篇 Jon Skeet 写的关于实现单例模式的文章csharpindepth.com/Articles/General/Singleton.aspx

标签: c# oop


【解决方案1】:

您的模式是有效的。还有其他一些方法可以做到这一点,但这很好。

static Singleton() { }我不认为有必要,但我可能错了,它更类似于你需要在 C++ 中做的事情,以确保当你调用它时,它会抓住单例。

由于 _obj 是静态的,因此该类在任何给定时间只能有 1 个版本,这意味着无论何时使用 .Object 调用它,它都会返回这个有效副本。

【讨论】:

    【解决方案2】:
    1. 是的,这种模式几乎是单例模式的基本实现。
    2. 虽然并非绝对必要,但该行的目的似乎是想教您一些有关 C# 的知识,因为静态构造函数与常规构造函数不同。 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors

    注意:

    在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。

    1. 类通过私有构造函数实现这一点,这意味着只有类实现中的代码才能实例化实例。

    当您只想创建一个类的实例时,通常使用单例模式。例如,您可能希望有一个 InputManager 类来处理引擎的所有鼠标和键盘事件。拥有此类的多个实例是没有意义的,因为这样您就必须使管理器的多个副本保持最新,然后确定处理事件的工作是谁。相反,您可以使用单例来确保输入全部由一位经理处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      相关资源
      最近更新 更多