Blue Theme Orange Theme Green Theme Red Theme
 
World Class ASP.NET Hosting – Click Here for 3 Months Free/NO Setup Fee!
Home | Forums | Videos | Photos | Downloads | Blogs | Interviews | Jobs | Beginners | Training
 | Consulting  
Submit an Article Submit a Blog 
 Login Close
User Id:
Password:
 
Forgot Password
Forgot Username
Why Register
 Jump to
Skip Navigation Links
TechnologyExpand Technology
WebsiteExpand Website
 Resources  
Close
 Our Network  
Close
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:
Total page views :  21798
Total downloads : 
   Print Read/Post comments Post a comment  Similar Articles  
   Email to a friend  Bookmark  Author's other articles  
 
Become a Sponsor

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


Login to add your contents and source code to 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.
Go.NET
Build custom interactive diagrams, network, workflow editors, flowcharts, or software design tools. Includes many predefined kinds of nodes, links, and basic shapes. Supports layers, scrolling, zooming, selection, drag-and-drop, clipboard, in-place editing, tooltips, grids, printing, overview window, palette. 100% implemented in C# as a managed .NET Control. Document/View/Tool architecture with many properties&events. Optional automatic layout.
Dundas Software
Dundas Chart for .NET is the most advanced .NET charting package available today.  With an extremely complete feature set, elegant architecture and easy implementation, Dundas Chart can quickly add advanced Charting functionality to enhance and transform ASP.NET and Windows Forms applications.  Whether you are implementing charting into internal projects, or building applications for clients, Dundas Chart offers advanced technology and advanced results to get the most out of data.
Clickatell's SMS Gateway
Clickatell's Developer Solutions allow you to SMS enable any website or application via a range of API's. Learn More about our API connections.
Free access to .NET Memory Management video
Everything you need to know about Garbage Collection, Temporary Objects, Fragmentation, Finalization and common causes of memory leaks in .NET. Watch the video here.
Microsoft Visual Studio 2010 Professional
Microsoft Visual Studio 2010 Professional will launch on April 12, but you can beat the rush and secure your copy today by pre-ordering at the affordable estimated retail price of $549 (US). Pre-order now.
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.
Developer-Ready ASP.NET 2.0 Web Hosting with 3 MONTHS FREE
Now supporting .NET 3.0 Framework with Windows Workflow Foundation, Windows Communication Foundation (WCF), Windows Presentation Foundation (WPF), windows CardSpace (WCS)! Providing more flexibility for Developers with Web Services Support and a User/Permission Manger. Also supporting MS SQL 2005/2000 with Real-Time Backups, FREE Automated Attach .MDF Tool, FREE SQL Restore and Shrink SQL DB Tools, and SQL
 
   Print Read/Post comments Post a comment  Similar Articles  
   Email to a friend  Bookmark  Author's other articles  
 
 Post a Feedback, Comment, or Question about this article
Subject:  
Comment:  
Click Here for 6 Months Free! Powerful ASP.NET Hosting at your Fingertips!
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 | Delete | Modify | 

 Hosted by MaximumASP  |  Found a broken link?  |  Contact Us  |  Terms & conditions  |  Privacy Policy  |  Site Map  |  Suggest an Idea  |  Media Kit
Current Version: 5.2009.6.2
 © 2010  contents copyright of their authors. Rest everything copyright Mindcracker. All rights reserved.