DEV Community

mohamed Tayel
mohamed Tayel

Posted on

Mastering C# Fundamentals: Creating Objects

Meta Description: Learn how to create and use classes and objects in C#. Understand the difference between classes and instances, the role of constructors, and how to instantiate objects effectively for modular and maintainable code.

In C#, a class serves as a blueprint for creating real-world models. However, defining a class is just the beginning; to truly leverage it, you need to instantiate objects based on that class. This process is crucial in building meaningful applications, as it allows you to create individual entities—called instances—from your blueprints.

In this article, we'll dive deep into how to use a class, create instances from it, and understand the difference between a class and its objects.

What Are Classes and Objects?

A class is a template or a blueprint of a concept or structure, much like an architect's plan for a house. The class defines the attributes and behaviors that an instance can have. For instance, an Employee class may define fields such as FirstName and LastName, but it's not tied to specific values until we create an instance of that class.

An object is an actual instance of the class. It’s a real representation that occupies memory space, with specific values assigned to the attributes defined in the class. Imagine creating multiple objects from the Employee class, each representing a different employee: one with FirstName as "John" and another with "Sara". These objects are distinct and have their own memory space.

Creating an Instance of a Class

The process of creating an instance of a class is called instantiation. In C#, this is done using the new keyword, which is followed by the class name and brackets (to call the constructor). Let’s see how this works step by step:

Employee john = new Employee(1, "John", "Doe");
Enter fullscreen mode Exit fullscreen mode

In this code:

  • Employee john declares a variable named john of type Employee.
  • new Employee(...) is the instantiation of an object, where we call the constructor to initialize the instance.
  • The constructor sets up the fields like FirstName, LastName, etc., based on the arguments passed.

Constructors: Building Your Object

A constructor is a special method in C# used to create and initialize an object of a class. The constructor has no return type, and its name matches the class name.

If we do not define a constructor, C# provides a default constructor—an empty, parameterless constructor that initializes the object without setting specific values. However, in most real-world scenarios, we create our own constructors to set initial values, as shown below:

public class Employee
{
    // Properties
    public int EmployeeID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    // Constructor
    public Employee(int employeeID, string firstName, string lastName)
    {
        EmployeeID = employeeID;
        FirstName = firstName;
        LastName = lastName;
    }
}
Enter fullscreen mode Exit fullscreen mode

In the above example:

  • The constructor accepts parameters like employeeID, firstName, and lastName to initialize the new object.
  • This helps ensure that each object is created with all necessary information, making the code more predictable and consistent.

Overloaded Constructors

In many cases, we may want to initialize objects in different ways. C# allows us to overload constructors by defining multiple constructors with different parameter sets.

public Employee(int employeeID, string firstName, string lastName, double hourlyRate)
{
    EmployeeID = employeeID;
    FirstName = firstName;
    LastName = lastName;
    hourlyRate = hourlyRate;
}
Enter fullscreen mode Exit fullscreen mode

With constructor overloading, we can create an instance with different levels of detail based on the parameters provided.

Using the new Keyword and Accessing Members

Creating a new instance always involves the new keyword, which is used to allocate memory for the object and call the appropriate constructor. Once we have an object, we can use the dot operator (.) to access its members—properties or methods.

Employee john = new Employee(1, "John", "Doe");
john.PerformWork(); // Calling a method on the object
john.FirstName = "Jonathan"; // Modifying a property of the object
Enter fullscreen mode Exit fullscreen mode

Here, the dot operator is used to invoke the PerformWork() method and to change the value of FirstName.

Reference Types and the Role of Constructors

In C#, classes are reference types. This means that the variable holds a reference (or memory address) to where the actual data is stored, rather than containing the data itself.

When you create an instance of Employee using the new keyword, the variable (john in our example) does not directly contain the employee data but instead points to the memory location where the data is stored. This is different from value types, such as int, where the variable contains the actual value.

Using Constructors to Set Initial Values

Let’s take a look at our Employee class again, which has a constructor to set initial values:

public class Employee
{
    public int EmployeeID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    // Constructor
    public Employee(int employeeID, string firstName, string lastName)
    {
        EmployeeID = employeeID;
        FirstName = firstName;
        LastName = lastName;
    }

    // Method to perform work
    public void PerformWork()
    {
        Console.WriteLine($"{FirstName} {LastName} is working.");
    }
}
Enter fullscreen mode Exit fullscreen mode

We can instantiate objects of the Employee class like this:

Employee john = new Employee(1, "John", "Doe");
Employee sara = new Employee(2, "Sara", "Lee");
Enter fullscreen mode Exit fullscreen mode

Each of these instances has its own unique values for FirstName and LastName, demonstrating how objects represent individual instances of a class.

The Default Constructor

By default, if you don't provide any constructor in your class, C# automatically creates one for you. This default constructor is parameterless, and it simply creates the instance without any specific initial values.

However, once you define a custom constructor, the default constructor is no longer automatically provided. If needed, you must explicitly define it:

public Employee() 
{
    // Optional default constructor
}
Enter fullscreen mode Exit fullscreen mode

Invoking Methods on Objects

After creating an object, you can call its methods or change its properties:

// Creating an instance of Employee
Employee john = new Employee(1, "John", "Doe");

// Calling methods on the instance
john.PerformWork(); // Output: "John Doe is working."

// Modifying properties of the instance
john.FirstName = "Jonathan";
Console.WriteLine(john.FirstName); // Output: "Jonathan"
Enter fullscreen mode Exit fullscreen mode

Simplified Syntax for Instantiation

With C# 9, you can use a shorthand syntax to instantiate objects:

var john = new Employee(1, "John", "Doe");
Enter fullscreen mode Exit fullscreen mode

In this case, you omit writing the type again on the right-hand side. This can make the code shorter and more readable, depending on your preference.

Summary

In this article, we covered:

  • Classes as blueprints used to create objects, which are real instances of those blueprints.
  • The new keyword, which is used to create an instance or instantiate an object of a class.
  • Constructors, which are special methods used to initialize objects. Constructors can be default or custom, and we can overload them for flexibility.
  • Reference Types: Classes are reference types, meaning the variable holds a reference to the memory location of the actual object.
  • Methods and Dot Operator: After creating an instance, we use the dot operator to access properties and methods of the object.

By understanding how to create and use classes and objects in C#, you are diving into the core of object-oriented programming. This knowledge forms the foundation for writing modular, reusable, and maintainable code that models real-world systems effectively.

Top comments (0)