gpt4 book ai didi

c# - 使用单例而不是全局静态实例

转载 作者:太空狗 更新时间:2023-10-29 18:14:24 26 4
gpt4 key购买 nike

我今天遇到了一个问题,一位 friend 建议我使用全局静态实例或更优雅的单例模式。我花了几个小时阅读有关单例的内容,但仍有一些事情让我难以理解。

背景:我试图完成的是创建一个 API 实例并在我的所有类中使用这个实例(而不是建立新连接等)。

似乎有大约 100 种创建单例的方法,但在 yoda 的帮助下我找到了一些线程安全的例子。 ..所以给出以下代码:

public sealed class Singleton
{
public static Singleton Instance { get; private set; }

private Singleton()
{
APIClass api = new APIClass(); //Can this be done?
}

static Singleton() { Instance = new Singleton(); }
}

如何/在哪里实例化这个新类以及如何从单独的类中调用它?

编辑:我意识到 Singleton 类可以用类似的东西调用

Singleton obj1 = Singleton.Instance();

但我能否访问 API 类(即 obj1.Start)中的方法? (不是我需要,只是问)

编辑#2:我检查答案可能有点过早,但我确实有一件小事仍然给我带来问题。 API 启动正常,不幸的是我能够启动两个实例?

新代码

public sealed class SingletonAPI
{
public static SingletonAPI Instance { get; private set; }

private SingletonAPI() {}

static SingletonAPI() { Instance = new SingletonAPI(); }

// API method:
public void Start() { API myAPI = new API();}
}

但是如果我尝试做这样的事情......

SingletonAPI api = SingletonAPI.Instance;
api.Start();
SingletonAPI api2 = SingletonAPI.Instance; // This was just for testing.
api2.Start();

我收到一条错误消息,提示我无法启动多个实例。

最佳答案

为什么不直接向您的单例添加一个公共(public) APIClass 属性?

public sealed class Singleton
{
public static Singleton Instance { get; private set; }

private APIClass _APIClass;

private Singleton()
{
_APIClass = new APIClass();
}

public APIClass API { get { return _APIClass; } }

static Singleton() { Instance = new Singleton(); }
}

然后你的调用站点看起来像:

Singleton.Instance.API.DoSomething();

或者如果您是 API 类的作者,您可以将其本身设为单例,而不是将其包装在单例中:

public sealed class SingletonAPI
{
public static SingletonAPI Instance { get; private set; }

private SingletonAPI() {}

static SingletonAPI() { Instance = new SingletonAPI(); }

// API method:
public void DoSomething() { Console.WriteLine("hi"); }
}

API 调用:

SingletonAPI.Instance.DoSomething();

关于c# - 使用单例而不是全局静态实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2588897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com