4

我看到了这样的实现:

class MyClass
{
    private static readonly MyClass _instance = new MyClass();

    public static MyClass Instance{
        get{ return _instance; }
    }
}

为什么不让它变得简单呢?

class MyClass
{
    public static readonly MyClass Instance = new MyClass();
}
4

2 回答 2

5

可以像这样公开公共字段 - 但我不希望这样做。如果将其保留为属性,则可以稍后更改实现。例如,假设您稍后添加了一个静态方法,您希望能够在不初始化单例的情况下调用该方法 - 使用属性版本,您可以将代码更改为:

public sealed class MyClass
{
    public static MyClass Instance { get { return InstanceHolder.instance; } }

    private MyClass() {}

    private static class InstanceHolder
    {
        internal static readonly MyClass instance = new MyClass();
    }

    public static void Foo()
    {
        // Calling this won't initialize the singleton
    }
}

(在原始版本中,单例可能会被初始化,也可能不会——这取决于 CLR。​​)

这只是您可能希望稍后更改实现的一个示例。使用属性,您可以做到这一点 - 使用字段,您不能。

于 2013-01-03T20:07:36.650 回答
2

你在那里得到的东西会很好用,但公共领域通常不赞成使用属性。您可以更改的实现,get { ... }而无需更改调用代码。这将使您能够(例如)切换到延迟初始化,其中仅在第一次使用实例时创建实例。

请注意,虽然调用代码不需要更改,但它会更改您的类的签名,因为只读属性与只读字段不同。

于 2013-01-03T20:07:31.863 回答