Blue Theme Orange Theme Green Theme Red Theme
 
Mindcracker MVP Summit 2012
Home | Forums | Videos | Advertise | Certifications | Downloads | Blogs | Interviews | Jobs | Beginners | Training
 | Consulting  
Submit an Article Submit a Blog 
 Jump to
Skip Navigation Links
TechnologyExpand Technology
WebsiteExpand Website
Nevron Chart
Search :       Advanced Search »
Home » C# Language » C# Object Instantiation: Part I. Constructors

C# Object Instantiation: Part I. Constructors

There are many ways to approach object instantiation. In this article we'll cover a few of the patterns used to instantiate objects.

Author Rank :
Page Views : 34676
Downloads : 0
Rating :
 Rate it
Level : Beginner
   Print Read/Post comments Post a comment  Similar Articles  
   Email to a friend  Bookmark  Author's other articles  
 
Team Foundation Server Hosting
Become a Sponsor
Discover the top 5 tips for understanding .NET Interop
Become a Sponsor
 Tag Cloud
 Latest Jobs
More ... 
 Latest Interview Questions
More ... 

Part I. Standard "New-Uping"

The first way we learned to approach object instantiation was with the constructor method on the class. This is the tried and true (and only) way to actually make an instance of a class.  The constructor is a method with no return type declared and has the same name as the class it is declared in.

Right about now you're probably already thinking "Hey wait a minute! What about the many approaches you mentioned?!?"  Well, all the different approaches are really just different ways to control where (and when) we new-up our objects and I'll get to these cool tricks in Part II after we cover the basics.

The Default Constructor

So, to get started, when we declare a constructor as follows:

public class One:Number
{
    public One() { }
}

We new-up (instantiate) the object using the constructor we defined:

One objOne = new One();

Every time we make a new instance of the "One" class, the constructor method will be run.  If there is actually code in the constructor, it will be executed on instantiation of the object.

When the following class is instantiated:

public class Number
{
    protected Number()
    {
        Console.WriteLine(GetType().ToString() + " built");
    }
}

We'll get a call to the constructor and output to the console.

With C#, if no constructor is defined, we get a default constructor by default.  This default constructor will have no parameters and will not do anything and essentially be the same as if we had declared an empty constructor so these two class declarations are equivalent.

No constructor defined (ends up the same as below):

public class One:Number{}

Default constructor defined (ends up the same as above):

public class One:Number
{
    public One() { }
}

Changing the Default Constructor

Also with C#, as soon as we declare a constructor with a signature different than the default constructor, we no longer get a default constructor like in the following two examples:

Input parameter change:  The default constructor has no parameters, so as soon as we declare an input parameter requirement on the constructor we loose the default constructor:           

public class One : Number
{
    public One(int x) { }
}

In this case we are now required to pass an integer on instantiation:

One objOne = new One(3);

Accessor change:  the default constructor is public, so as soon as we declare that the constructor is private to the "One" class, we can no longer instantiate the object from outside the class.  This probably seems strange right now, but we'll discuss how to use this in a bit.

public class One : Number
{
    private One() { }
}

Providing Multiple Constructors

We can provide multiple constructors, so if we want to have the choice of whether to supply a value to the constructor or not we'll just write two of them:

public class One : Number
{
    private One() { }
    private One(int x) { }
}

This will allow us to instantiate by passing nothing or passing an integer when we new-up the "One" class so the following two declarations are now valid:

One objOne = new One(3);
One objOne = new One();

Using Constructors

By now you're probably asking "Ok... Real nice constructors -n- all.  I get it.  But what's the point, really?"

The point of constructors is to provide any initialization that the class needs.  Let's say we have a property that tells us when the object was instantiated as in the following class.

public class Startup
{
    private DateTime m_startDate;

    public DateTime StartDate
    {
        get { return m_startDate; }
    }
}

Ok, that's all fine and good until we need to initialize the value to the time the object was actually instantiated.  To do this, we use the constructor:

public class Startup
{
    public Startup()
    {
        m_startDate = DateTime.Now;
    }

    private DateTime m_startDate;

    public DateTime StartDate
    {
        get { return m_startDate; }
    }
}

Now we have a class that where the value will be guaranteed to be initialized.;

Constructors Calling Constructors

If we use the previous example but want to be able to specify the start date, we can overload the constructor:

public class Startup
{
    public Startup()
    {
        m_startDate = DateTime.Now;
    }

    public Startup(DateTime startDate)
    {
        m_startDate = startDate;
    }

    private DateTime m_startDate;

    public DateTime StartDate
    {
        get { return m_startDate; }
    }
}

So now we can choose whether or not to specify the start date.  If we don't specify it in the constructor, we get the default which is DateTime.Now.

This works fine, but just to follow best practices and to keep our sanity when it comes to maintaining our code, we should specify one (and only one) constructor to be the "master" constructor where everything happens so if there are changes in one of the constructors we don't have to hunt down what is happening where.  The "master" constructor will be the one that sets all the member variables in the class:          

public class Startup
{
    // Master constructor:
    // It sets all the values in the class
    public Startup(DateTime startDate)
    {
        m_startDate = startDate;
    }

    private DateTime m_startDate;

    public DateTime StartDate
    {
        get { return m_startDate; }
    }
}

Now what we want to do is have all the other constructors call the "master" constructor.  The syntax for chaining our constructors is as follows:

    public Startup() : this(DateTime.Now)
    {
    }

So now, our default construtor will call our "master" constructor and pass the current date and time.  If we choose to change the default time in the default constructor we'll just update the value passed from the default constructor to the "master" constructor.  This may not seem like a big deal now, but if we have dozens of constructors on an object, it is a good way to organize them so we get consistent behavior and don't repeat code somewhere that we could miss updating.

public class Startup
{
    // Master constructor:
    // It sets all the values in the class
    public Startup(DateTime startDate)
    {
        m_startDate = startDate;
    }

    public Startup() : this(DateTime.MinValue) { }

    private DateTime m_startDate;

    public DateTime StartDate
    {
        get { return m_startDate; }
    }
}

Calling Constructors through the Inheritance Chain

The final thing we'll look at is calling constructor methods through the inheritance chain.

If we have a base class with a parameterized constructor

public abstract class Animal
{
    public Animal(string name)
    {
        m_name = name;
    }

    private string m_name;

    public string Name
    {
        get { return m_name; }
        set { m_name = value; }
    }
}

We can call the constructor through a derived class by using the base keyword. So in the following class the constructor's parameters are passed to the base constructor.

public class Cat : Animal
{
    public Cat(string name)
        : base(name)
    { }
}

Well, that's pretty much it for the constructor and the main way to "new-up" objects.  In the next article we'll look at different patterns for controlling the instantiation of our classes.

Until next time,
Happy coding

Comment Request!
Thank you for reading this post. Please post your feedback, question, or comments about this post Here.
Login to add your contents and source code to this article
 [Top] Rate this article
 
 About the author
 
Matthew Cochran
Looking for C# Consulting?
C# Consulting is founded in 2002 by the founders of C# Corner. Unlike a traditional consulting company, our consultants are well-known experts in .NET and many of them are MVPs, authors, and trainers. We specialize in Microsoft .NET development and utilize Agile Development and Extreme Programming practices to provide fast pace quick turnaround results. Our software development model is a mix of Agile Development, traditional SDLC, and Waterfall models.
Click here to learn more about C# Consulting.
 
Introducing MaxV - one click. infinite control. Hyper-V Hosting from MaximumASP.
Finally – a virtual platform that delivers next-generation Windows Server 2008 Hyper-V virtualization technology from a managed hosting partner you can truly depend on. Visit www.maximumasp.com/max for a FREE 30 day trial. Hurry offer ends soon. Climb aboard the MaxV platform and take advantage of High Availability, Intelligent Monitoring, Recurrent Backups, and Scalability – with no hassle or hidden fees. As a managed hosting partner focused solely on Microsoft technologies since 2000, MaximumASP is uniquely qualified to provide the superior support that our business is built on. Unparalleled expertise with Microsoft technologies lead to working directly with Microsoft as first to offer IIS 7 and SQL 2008 betas in a hosted environment; partnering in the Go Live Program for Hyper-V; and product co-launches built on WS 2008 with Hyper-V technology.
Dynamic PDF
ceTE software specializes in components for dynamic PDF generation and manipulation. The DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and new content to existing PDF documents from within your applications.
Discover the top 5 tips for understanding .NET
Ricky Leeks presents the top 5 tips for understanding .NET Interoperability. Learn more.
Nevron Chart for .NET 2010.1 Now Available
The leading .NET charting control now features PDF, Flash and Silverlight export, visualization of large datasets and more. Deliver true charting functionality to your BI, Scorecard, Presentation or Scientific apps. Download evaluation now.
ASP.NET 4 Hosting
Get 2 Months Free of ASP.NET Hosting for Only $4.95/month! Receive FREE MS SQL and MySQL Databases Including ASP.NET 4/3.5, MVC 3.0, Silverlight 4, Windows 2008/IIS 7.0 Plus FREE IIS 7 Modules. Host UNLIMITED ASP.NET Web Sites – Click Here!
 
 Post a Feedback, Comment, or Question about this article
Subject:
Comment:
Discover the top 5 tips for understanding .NET Interop
Become a Sponsor
 Comments
Constructor calling heirarchy by Nandkishore On July 31, 2007
Hi, just wondering as to why is that the derived class constructor is called ahead of the base constructor in C#. Is'nt it the opposite way in C++?
Reply | Email | Modify 
6 Months Free & No Setup Fees ASP.NET Hosting!
 © 2012  contents copyright of their authors. Rest everything copyright Mindcracker. All rights reserved.