jlang
jlang

Reputation: 157

C# Singleton "GetInstance" Method or "Instance" Property?

From the perspective of an API end-user who needs to "get an the instance" of a Singleton class, do you prefer to "get" an the .Instance property or "call" a .GetInstance() Method?

public class Bar
{
    private Bar() { }

    // Do you prefer a Property?
    public static Bar Instance
    {
        get
        {
            return new Bar();
        }
    }

    // or, a Method?
    public static Bar GetInstance()
    {
        return new Bar();
    }
}

Upvotes: 11

Views: 40777

Answers (7)

Raghav
Raghav

Reputation: 9628

public class Singleton
{

    private volatile static Singleton uniqueInstance;
    private static readonly object padlock = new object();

    private Singleton() { }

    public static Singleton getInstance()
    {
        if (uniqueInstance == null)
        {
            lock (padlock)
            {
                if (uniqueInstance == null)
                {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}

In the above code double checking is implemented ,first it is checked if an instance is is created and if not lock has been established .Once in this block

                if (uniqueInstance == null)
                {
                    uniqueInstance = new Singleton();
                }

if the instance is null then create it.

Also, the uniqueInstance variable is declared to be volatile to ensure that assignment to the instance variable completes before the instance variable can be accessed.

Upvotes: 3

RaYell
RaYell

Reputation: 70484

If you want to create singleton you cannot just return new object on every GetInstance call or Instance property getter. You should do something like this:

public sealed class Bar
{
    private Bar() { }

    // this will be initialized only once
    private static Bar instance = new Bar();

    // Do you prefer a Property?
    public static Bar Instance
    {
        get
        {
            return instance;
        }
    }

    // or, a Method?
    public static Bar GetInstance()
    {
        return instance;
    }
}

And it doesn't really matter which way of doing that you choose. If you prefer working with properties choose it, if you prefer methods it will be ok as well.

Upvotes: 14

Michael Todd
Michael Todd

Reputation: 17071

Depends. Do you need to pass parameters? If so, I'd do GetInstance(). If not, probably doesn't matter (at least from a calling standpoint, since they're really both methods anyway; however, it does matter if you're trying to be more standards-based and, in that case, an instance appears to be better).

Upvotes: 3

Franci Penov
Franci Penov

Reputation: 76021

As @Rex said, it depends on the semantic you want to convey.

GetInstance() does not necessarily imply a singleton instance. So, I would use GetInstance() in the case where the instance creation happens on demand, direct new is not desireable and the instance could be, but is not guaranteed to be the same. Object pools fit these criteria as well. (In fact, a singleton is a specialization of an object pool with state preservation :-))

Static Instance property on the other hand implies a singleton and preserved instance identity.

Btw, as @RaYell mentioned your sample code is not a singleton, so you shouldn't be using Instance property. You can still use the GetInstance() method in this case, as it would serve as an instance factory.

Upvotes: 0

Rex M
Rex M

Reputation: 144182

As with just about everything, it depends :)

If the singleton is lazy-loaded and represents more than a trivial amount of work to instantiate, then GetInstance() is more appropriate, as a method invocation indicates work is being done.

If we're simply masking to protect the singleton instance, a property is preferable.

Upvotes: 4

Athiwat Chunlakhan
Athiwat Chunlakhan

Reputation: 7809

I prefer property, these are standard patterns.

Upvotes: 0

Noon Silk
Noon Silk

Reputation: 55172

In C#, I would far prefer .Instance, as it fits in with the general guidelines.

Upvotes: 20

Related Questions