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

Mat*_*els 10 c# singleton automatic-properties

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

现在我正在做一个单身人士并且想:"嘿,让我们在这里尝试自动属性".

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

    private MySingleton() {}

    static MySingleton() { MySingleton = new MySingleton(); }
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:"实现像这样的单身人士是一个好主意吗?"

我不是在问一个单身一般是不是一个好主意.

Jon*_*eet 16

我不会亲自这样做.我不喜欢使用带私人二传手在那里,你永远不调用自动实现的属性真的要通过一个只读变量支持的只读属性.只有一行代码可以更明确地表达您的意思:

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

    private MySingleton() {}

    static MySingleton() { mySingleton = new MySingleton(); }
}
Run Code Online (Sandbox Code Playgroud)

这样,没有人甚至试图改变单例类来重新分配属性或变量,因为编译器会阻止它们.他们必须添加一个setter和/或使变量非读取,这是一个更大的变化 - 希望他们重新考虑.

换一种说法:

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

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

public sealed class MySingleton
{
    public static MySingleton MySingleton { get; } = new MySingleton();    
    private MySingleton() {}         
    static MySingleton() {}
}
Run Code Online (Sandbox Code Playgroud)

  • @Philippe:发明了自动属性以使代码更简洁*其中替换代码等同于原始*.这里没有这样的等价:你用一个只读属性替换一个只读属性,即使它有一个私有的setter.这看起来似乎微不足道,但我更喜欢我的代码来表达我的意图 - 我的意图是这个值只能设置一次.自动实现的属性表达不同的意图. (6认同)

Eri*_*ert 10

我会从与Jon略有不同的方向来解决这个问题.无论对象是否是单例,它首先在逻辑上最好地建模为属性吗?

属性应该代表...属性.(Obvious队长再次罢工!)你知道.颜色.长度.高度.名称.家长.你在逻辑上认为是物的属性的所有东西.

我无法想象一个逻辑上是单身的物体的属性.也许你想出了一个我没有想过的场景; 今天早上我没有任何Diet Pepper博士.但我怀疑这是滥用模型语义.

你能描述单身人士是什么,为什么你认为它是某种东西的财产?

总而言之,我自己经常使用这种模式; 通常是这样的:

class ImmutableStack<T>
{
    private static readonly ImmutableStack<T> emptystack = whatever;
    public static ImmutableStack<T> Empty { get { return emptystack; } }
    ...
Run Code Online (Sandbox Code Playgroud)

逻辑上"空"是不可变堆栈的属性吗?不,这是能够说出来的令人信服的好处

var stack = ImmutableStack<int>.Empty;
Run Code Online (Sandbox Code Playgroud)

我希望物业成为逻辑上的财产.话

var stack = ImmutableStack<int>.GetEmpty();
Run Code Online (Sandbox Code Playgroud)

看起来很奇怪.

在这种情况下,是否更好地拥有只读字段和常规属性,或静态ctor和autoprop,似乎不是一个有趣的问题,而不是首先使它成为属性.在一种"纯粹主义"的情绪中,我很可能会与Jon站在一起并使其成为一个只读的领域.但我也经常使用私有设置器的autoprops模式用于逻辑上不可变的对象,只是出于懒惰.

如何解决问题的各个方面?