7 minute read

Class and Members in a Class

In C#, classes are used to create custom types.

C# Fields and Methods

Fields: are variables and Methods: are functions in a class.

/*
The animal namespace
*/
namespace Animals
{
    // An animal class
    public class Animal
    {
    }

    // A cat class
    public class Cat
    {
        // Class fields
        // The name of the cat
        public string Name = "Unknown";
        // The birthday of the cat
        public DateTime DateOfBirth;

        // Class methods
        // Print out method
        public void WriteToConsole()
        {
            Console.WriteLine($"{Name} was born on a {DateOfBirth:dddd}.");
        }
    }

    // A dog class
    public class Dog
    {
    }
}

C# Class Constructor and Finalizer (Destructor)

this is a keyword refers to the current instance of a class. Dot notation . is an operator to access a member (a field or a method) of a clas. An object is an instance of a class. An object can be created from a class using the new keyword.

using System;
using Animals;

// namespace
namespace MyBusiness
{
    // main program
    internal class Program
    {
        static void Main(string[] args)
        {
            Cat myCat = new Cat();
            Cat nana = new Cat("Nana", new DateTime(2019, 12, 9));

            myCat.WriteToConsole();
            Console.WriteLine($"{nana.Name} was born on a {nana.DateOfBirth:dddd}.");
            nana.WriteToConsole();
        }
    }
}

/*
The animal namespace
*/
namespace Animals
{
    // A cat class
    public class Cat
    {
        // Class fields
        // The name of the cat
        public string Name = "Unknown";
        // The birthday of the cat
        public DateTime DateOfBirth;

        // Class methods
        // Constructors
        // Default constructor. It will be called by default
        public Cat()
        {
            this.Name = "Unknown";
            this.DateOfBirth = DateTime.Today;
            // You can use the following instread
            // name = "Unknown";
            // dateOfBirth = DateTime.Today;
        }
        // Parameterized Constructor
        public Cat(string name, DateTime dateOfBirth)
        {
            this.Name = name;
            this.DateOfBirth = dateOfBirth;
            // You "cannot" use the following instread!
            // name = name;
            // dateOfBirth = dateOfBirth;
        }
        // Finalizer
        ~Cat()
        {
            // This function will be called when the object is desctroyed.
        }

        // Print out method
        public void WriteToConsole()
        {
            Console.WriteLine($"{Name} was born on a {DateOfBirth:dddd}.");
        }
    }
}
$ Unknown was born on a Sunday.
$ Nana was born on a Monday.

C# Access Modifiers Doc

Accessibility Levels Doc: Depending on the context in which a member declaration occurs, only certain declared accessibilities are permitted. If no access modifier is specified in a member declaration, a default accessibility is used.

using System;
using Animals;

// namespace
namespace MyBusiness
{
    // main program
    internal class Program
    {
        static void Main(string[] args)
        {
            Cat nana = new Cat("Nana", new DateTime(2019, 12, 9));

            nana.Poop(); // Compile error
            nana.Speak();
        }
    }
}

/*
The animal namespace
*/
namespace Animals
{
    // A cat class
    public class Cat
    {
        // Class fields
        // The name of the cat
        public string Name = "Unknown";
        // The birthday of the cat
        public DateTime DateOfBirth;

        // Class methods
        // Constructors
        // Default constructor. It will be called by default
        public Cat()
        {
            this.Name = "Unknown";
            this.DateOfBirth = DateTime.Today;
            // You can use the following instread
            // name = "Unknown";
            // dateOfBirth = DateTime.Today;
        }
        // Parameterized Constructor
        public Cat(string name, DateTime dateOfBirth)
        {
            this.Name = name;
            this.DateOfBirth = dateOfBirth;
            // You "cannot" use the following instread!
            // name = name;
            // dateOfBirth = dateOfBirth;
        }
        // Finalizer
        ~Cat()
        {
            // This function will be called when the object is desctroyed.
        }

        // Public method
        public void Speak()
        {
            Console.WriteLine("Meow!");
            Poop();
        }

        // Private method
        private void Poop()
        {
            Console.WriteLine($"{Name} is pooping!");
        }

        // Print out method
        public void WriteToConsole()
        {
            Console.WriteLine($"{Name} was born on a {DateOfBirth:dddd}.");
        }
    }
}
$ Meow!
$ Nana is pooping!

C# Property Doc

Read-only property: they have a get accessor but no set accessor.
Write only property: they have a set accessor, but no get accessor.
Read Write property: they have both a get and a set accessor.
Auto-implemented property: auto-implemented properties make property-declaration more concise when no additional logic is required in the property accessors.

using System;
using Animals;

// namespace
namespace MyBusiness
{
    // main program
    internal class Program
    {
        static void Main(string[] args)
        {
            Cat nana = new Cat("Nana", new DateTime(2019, 12, 9));

            Console.WriteLine($"{nana.Name}'s age is {nana.Age}.");            
        }
    }
}

/*
The animal namespace
*/
namespace Animals
{
    // A cat class
    public class Cat
    {
        // Class fields
        // The name of the cat
        public string Name = "Unknown";
        // The birthday of the cat
        public DateTime DateOfBirth;

        // Auto-implemented property
        public int Age { get; set; }

        // private int _age;            // Camel Case for a private fields and prefix with _

        // Read-Write property
        // public int Age              // Pascal Case for a public fields or methods
        // {
        //     get { return _age; }
        //     set { _age = value; }   // Must use the keyword value
        // }

        // Read-only property
        // public int Age              // Pascal Case for a public fields or methods
        // {
        //     get { return _age; }
        // }

        // Write only property
        // public int Age              // Pascal Case for a public fields or methods
        // {
        //     set { _age = value; }   // Must use the keyword value
        // }

        // Class methods
        // Constructors
        // Default constructor. It will be called by default
        public Cat()
        {
            this.Name = "Unknown";
            this.DateOfBirth = DateTime.Today;
        }
        // Parameterized Constructor
        public Cat(string name, DateTime dateOfBirth)
        {
            this.Name = name;
            this.DateOfBirth = dateOfBirth;
            // Calculate the age of the cat instance
            this.Age = DateTime.Today.Year - dateOfBirth.Year;
        }
        // Finalizer
        ~Cat()
        {
            // This function will be called when the object is desctroyed.
        }

        // Public method
        public void Speak()
        {
            Console.WriteLine("Meow!");
            Poop();
        }

        // Private method
        private void Poop()
        {
            Console.WriteLine($"{Name} is pooping!");
        }

        // Print out method
        public void WriteToConsole()
        {
            Console.WriteLine($"{Name} was born on a {DateOfBirth:dddd}.");
        }
    }
}
$ Nana\'s age is 3.

Overloading Methods

Another way to simplify methods is to make parameters optional.

// The function describes what happens if a cat speaks
public string Meow()
{
    return "Meow!";
}

// Overloaded function of Meow(), while the input parameters are different
public string Meow(string target)
{
    return $"{name} says 'Meow {target}!'";
}

// Another function that does the same thing as the above one,
// but with a different method name
public string SayMeowTo(string target)
{
    return $"{name} says 'Meow {target}!'";
}

Properties and Indexers

In namespace Animals, add

using System;
using System.Collections.Generic; // To be able to use the data structure "list"
using Animals;

// namespace
namespace MyBusiness
{
    // main program
    internal class Program
    {
        static void Main(string[] args)
        {
            // Declare a cat
            Cat nana = new Cat("Nana", new DateTime(2019, 12, 9));
            // Declare a cat array, static at runtime
            Cat[] catArray = new Cat[3];
            // Declare a cat list, dynamic at runtime, more flexible
            List<Cat> catList = new List<Cat>();

            for (int i = 0; i < catArray.Length; i++)
            {
                if (i == 0) catArray[i] = new Cat("Nana", new DateTime(2019, 12, 9));
                if (i == 1) catArray[i] = new Cat("Coffee", new DateTime(2019, 6, 20));
                if (i == 2) catArray[i] = new Cat("Kiwi", new DateTime(2018, 11, 19));
            }

            // Iterate the array to create cats
            for (int i = 0; i < catArray.Length; i++)
            {
                catList.Add(new Cat("Nana", new DateTime(2019, 12, 9)));
                catList.Add(new Cat("Coffee", new DateTime(2019, 6, 20)));
                catList.Add(new Cat("Kiwi", new DateTime(2018, 11, 19)));
            }

            // indexers, are another way to access a list-like data structure through indices
            catList[0].Children.Add(new Cat("Naffee", new DateTime(2019, 12, 9)));
            catList[0].Children.Add(new Cat("Kiffee", new DateTime(2019, 12, 9)));

            // Iterate the list to create cats, and you can access children like an array
            for (int i = 0; i < catList[0].Children.Count; i++)
            {
                Console.WriteLine($"The children of {catList[0].Name} include {catList[0].Children[i].Name}.");
                // The statement above and below show the same information.
                Console.WriteLine($"The children of {catList[0].Name} include {catList[0][i].Name}.");
            }
        }
    }
}

/*
The animal namespace
*/
namespace Animals
{
    // A cat class
    public class Cat
    {
        // Class fields
        // The name of the cat
        public string Name = "Unknown";
        // The birthday of the cat
        public DateTime DateOfBirth;

        // Auto-implemented property
        public int Age { get; set; }

        private static int _sharedToilet;
        public List<Cat> Children = new List<Cat>();

        // Class methods
        // Constructors
        // Default constructor. It will be called by default
        public Cat()
        {
            this.Name = "Unknown";
            this.DateOfBirth = DateTime.Today;
        }
        // Parameterized Constructor
        public Cat(string name, DateTime dateOfBirth)
        {
            this.Name = name;
            this.DateOfBirth = dateOfBirth;
            // Calculate the age of the cat instance
            this.Age = DateTime.Today.Year - dateOfBirth.Year;
        }
        // Finalizer
        ~Cat()
        {
            // This function will be called when the object is desctroyed.
        }

        // Public method
        public void Speak()
        {
            Console.WriteLine("Meow!");
            Poop();
        }

        // Private method
        private void Poop()
        {
            Console.WriteLine($"{Name} is pooping!");
        }

        // Self-implemented property method, if you want to achieve something more than
        // getting and setting the variables, if necessary
        public int SharedToilet
        {
            get
            {
                return _sharedToilet;
            }
            set
            {
                _sharedToilet = value;
            }
        }

        // If you want to get or set a specific content in a list, you can use indexers
        public Cat this[int index]
        {
            get
            {
                return Children[index];
            }
            set
            {
                Children[index] = value;
            }
        }

        // Print out method
        public void WriteToConsole()
        {
            Console.WriteLine($"{Name} was born on a {DateOfBirth:dddd}.");
        }
    }
}

The keyword static Doc

The static keyword is also part of the using static directive. It is a member shared by all class instance.

private static int sharedToilet;

Selected Theory

Useful Advanced C# Data Structure

  • Collections Doc. We will introduce one-by-one later.

Updated: