By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,050 Members | 1,564 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,050 IT Pros & Developers. It's quick & easy.

Singleton using static constructor

P: n/a
Why do these questions always come up on Friday afternoon?

I'm starting to use GoF singleton classes in my projects. Right off the bat,
I've run into a surprise. I thought that a Singleton could be implemented
using a static constructor, using code like this, based on version #4 at
http://www.yoda.arachsys.com/csharp/singleton.html:

public sealed class MyClass
{
private static MyClass m_MyClass = new MyClass();

static MyClass()
{
}

public static MyClass GetSingleton()
{
return m_MyClass;
}
}

According to the C# Language Specification (10.11 Static constructors), a
static constructor can't be called directly, so I'd use a call like this to
get the single instance of the class:

MyClass myObject = MyClass.GetSingleton();

However, .NET allows me to call the constructor directly:

MyClass myObject = new MyClass();

What's more, its allowing me to create multiple objects from the class. So
the Singleton approach is clearly failing.

What am I missing? Better yet, what's the simplest thread-safe approach to
implementing a Singleton in .NET 2.0? Thanks.
--
David Veeneman
Foresight Systems

Sep 29 '06 #1
Share this Question
Share on Google+
3 Replies


P: n/a
"David Veeneman" <da****@nospam.com (domain is my last name)a écrit dans
le message de news: %2***************@TK2MSFTNGP02.phx.gbl...

| However, .NET allows me to call the constructor directly:
|
| MyClass myObject = new MyClass();
|
| What's more, its allowing me to create multiple objects from the class. So
| the Singleton approach is clearly failing.
|
| What am I missing? Better yet, what's the simplest thread-safe approach to
| implementing a Singleton in .NET 2.0? Thanks.

You forgot to hide the default instance constructor :

public sealed class MyClass
{
private static MyClass m_MyClass = new MyClass();

static MyClass()
{
}

/////////////////////// don't forget this :-)
private MyClass() {}
//////////////////////

public static MyClass GetSingleton()
{
return m_MyClass;
}
}

Also see Jon's comments about thread safety.

Joanna

--
Joanna Carter [TeamB]
Consultant Software Engineer
Sep 29 '06 #2

P: n/a
Thanks, Joanna--that took care of it. So .NET wasn't calling the static
constructor--it was calling the implicit public constructor? And adding the
private constructor prevents the implicit public constructor, so all is
well. Right?
Sep 30 '06 #3

P: n/a
"David Veeneman" <da****@nospam.com (domain is my last name)a écrit dans
le message de news: uf*************@TK2MSFTNGP04.phx.gbl...

| Thanks, Joanna--that took care of it. So .NET wasn't calling the static
| constructor--it was calling the implicit public constructor? And adding
the
| private constructor prevents the implicit public constructor, so all is
| well. Right?

Sort of :-)

If you check out Jon's writings on singletons you will see that there is a
case for initialising the static field in the static constructor as this is
guaranteed to be called only once, just before the first call to the
GetInstance method, therefore ensuring the instance gets created in a
threadsafe manner. The code that you show doesn't create an instance, so you
needed to either check for null in the GetInstance method, which is not
threadsafe, or simply add a call to the instance constructor in the static
constructor, which is threadsafe.

Joanna

--
Joanna Carter [TeamB]
Consultant Software Engineer
Sep 30 '06 #4

This discussion thread is closed

Replies have been disabled for this discussion.