c# - 使用自动属性实现单例是个好主意吗?

标签 c# singleton automatic-properties

我最近发现了自动属性并且非常喜欢它们。此时此刻,我正试图在任何可能的地方使用它们。不仅仅是为了能够在任何地方使用它们,而是更多地了解它们在大多数情况下的工作情况。

现在我正在制作一个单例并想:“嘿,让我们在这里也试试自动属性”。

public class MySingleton
{
    public static MySingleton MySingleton { get; private set; }

    private MySingleton() {}

    static MySingleton() { MySingleton = new MySingleton(); }
}

所以我的问题是:“像这样实现单例是个好主意吗?”

我不是在问一般情况下单例是否是个好主意。

最佳答案

我个人不会那样做。我不喜欢将自动实现的属性与您永远不会调用的私有(private) setter 一起使用,真的您想要一个由只读变量支持的只读属性。只需多一行代码就可以更明确地说明您的意思:

public sealed class MySingleton
{
    private static readonly MySingleton mySingleton;
    public static MySingleton MySingleton { get { return mySingleton; } }

    private MySingleton() {}

    static MySingleton() { mySingleton = new MySingleton(); }
}

通过这种方式,甚至没有人更改单例类以重新分配属性或变量,因为编译器会阻止它们。他们必须添加一个 setter 和/或使变量成为非只读的,这是一个更大的变化 - 希望他们会重新考虑。

换句话说:

  • 是的,它会起作用。
  • 不,我认为这不是个好主意。

从 C# 6 开始,使用只读自动实现的属性会更容易:

public sealed class MySingleton
{
    public static MySingleton MySingleton { get; } = new MySingleton();    
    private MySingleton() {}         
    static MySingleton() {}
}

关于c# - 使用自动属性实现单例是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2117241/

相关文章:

c++ - 单例中静态声明之间的差异

f# - 用于测试单例序列的 Seq.exactlyOne 的非抛出版本

c#-3.0 - C# 3.0 :Automatic Properties - what would be the name of private variable created by compiler

c# - 在所有者类中使用属​​性与支持字段

c# - 用事件实现观察者模式

c# - 具有空白元素的 XML 类型的 SQLParameter,是否丢失了空白?

java - Java中单例的其他方式

c# - C# 中的自动属性是什么,它们的用途是什么?

c# - 如何将委托(delegate)传递给方法,其中委托(delegate)是非静态的?

javascript - 我如何分配字典(键:value) pair data using formdata to controller action in MVC