gpt4 book ai didi

c# - 基于 Jon Skeet 的 Singleton 的更简单的 Singleton

转载 作者:太空狗 更新时间:2023-10-30 01:30:55 26 4
gpt4 key购买 nike

我的代码中需要一个单例。我读了 Jon Skeet 的 page在单例上并根据他的推荐选择了这个模型(#4):

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

// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton(){}

private Singleton(){}

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

然后我通过几个步骤修改它以适应我的场景:

第 1 步:我不需要惰性实现,所以我去掉了静态构造函数(正如 Jon 在其文章末尾所建议的):

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

private Singleton(){}

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

第 2 步:然后我将“实例”Singleton 类替换为我正在使用的Logging 类:

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

private Singleton(){}

public static Logging Instance
{
get
{
return instance;
}
}
}

第 3 步:然后 Resharper 告诉我应该为我的“实例”属性使用自动属性:

public sealed class Singleton
{
private Singleton(){}

public static Logging Instance { get; } = new Logging();
}

第 4 步:然后 Resharper 告诉我应该将其切换为静态类:

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

我留下的与原来的非常不同。我知道在设置线程安全的 Singleton 时很容易出错。

所以我想问:我的任何步骤是否会使我的类不再是一个好的单例实现?

最佳答案

Do any of my steps make my class not a good Singleton implementation any more?

是的,他们有。

无论如何,您在步骤 #1 中删除的行为都是一个实现细节。删除空的静态构造函数就可以了;如果你想强制延迟初始化,Lazy<T>无论如何,这是一种更好的方法,即使它的开销稍微多一些。

在第 2 步,您的对象完全不再是单例,因为您不再能够控制对象实例 (Logging) 的创建数量。

我会说,根本不是单例就可以说是“不是一个好的单例实现”。

关于c# - 基于 Jon Skeet 的 Singleton 的更简单的 Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42258375/

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