Source: Ch1_OOP.pdf · EX0.pdf · EX1.pdf · EX11.pdf · EXer.pdf · Bro Code C# Full Course

Classes and Objects

OOP concepts, members, constructors, destructors, and value/reference behavior.

Defining a Class and Creating Objects

A class is a blueprint for objects. An object is an instance created with new. The class defines the fields, properties, and methods every instance will have.

csharp
public class Student
{
    public string Name = "";
    public int Age { get; set; }

    public void PrintInfo()
    {
        Console.WriteLine($"Name: {Name}, Age: {Age}");
    }
}

Student s = new Student();
s.Name = "Alice";
s.Age = 22;
s.PrintInfo();

Output

Name: Alice, Age: 22

Classes and Objects — Exercise 1

Access class members through the object reference using the dot (.) operator.

Fix the incorrect member access

Hint

Declare the object with new Car() before accessing its members.

What keyword creates a new instance of a class?

Fields

Fields are variables declared directly inside a class. Public fields are accessible from outside; private fields are not. All fields get a default value (0, false, null) if not initialized.

csharp
class Rectangle
{
    public double Width;
    public double Height;
    private string color = "white";

    public double Area() => Width * Height;
    public string GetColor() => color;
}

Rectangle r = new Rectangle();
r.Width = 5;
r.Height = 3;
Console.WriteLine(r.Area());
Console.WriteLine(r.GetColor());

Output

15
white

Fields — Exercise 1

Private fields can only be read or modified through the class's own methods.

Fix the direct access to a private field

Hint

balance is private and cannot be accessed directly from outside the class. Remove the direct assignment.

What access modifier makes a field visible only within its own class?

Properties

Properties are preferred over public fields because they let you add logic in get and set accessors. Auto-properties { get; set; } generate the backing field automatically.

csharp
class Person
{
    private int age;
    public int Age
    {
        get { return age; }
        set
        {
            if (value >= 0) age = value;
        }
    }

    public string Name { get; set; } = "";
}

Person p = new Person();
p.Name = "Bob";
p.Age = 30;
p.Age = -5;   // ignored by setter
Console.WriteLine($"{p.Name} is {p.Age}");

Output

Bob is 30

Properties — Exercise 1

A read-only property exposes a value without allowing external code to change it. Add a set accessor to make it writable.

Add write access to a read-only property

Hint

The property currently has only a get accessor. Add set { name = value; } to allow writing.

What keyword inside a set accessor refers to the incoming value?

Constructors

A constructor runs automatically when an object is created with new. It has the same name as the class and no return type. The default (parameterless) constructor is generated by the compiler if you do not define any.

csharp
class Circle
{
    public double Radius;

    public Circle()
    {
        Radius = 1.0;
    }

    public Circle(double r)
    {
        Radius = r;
    }

    public double Area() => Math.PI * Radius * Radius;
}

Circle c1 = new Circle();
Circle c2 = new Circle(5);
Console.WriteLine(c1.Radius);
Console.WriteLine(Math.Round(c2.Area(), 2));

Output

1
78.54

Constructors — Exercise 1

A constructor must have the exact same name as its class. A different name is treated as a regular method.

Fix the misnamed constructor

Hint

Constructors have no return type — not even void. Remove the void keyword.

When is a constructor called?

Destructors

A destructor (~ClassName) is called by the garbage collector when an object is no longer referenced. You rarely need to write one explicitly in modern C#.

csharp
class Resource
{
    public Resource() => Console.WriteLine("Constructed");
    ~Resource()       => Console.WriteLine("Destructed");
}

Resource r = new Resource();
Console.WriteLine("Object in use");

Output

Constructed
Object in use
Destructed

What is the correct syntax for a destructor named MyClass?

Value vs Reference Types

Value types (int, double, struct) copy their data on assignment. Reference types (class, array, string) copy the address — both variables then point to the same object.

csharp
int a = 10;
int b = a;
b = 99;
Console.WriteLine(a);   // 10 — unchanged

int[] arr1 = { 1, 2, 3 };
int[] arr2 = arr1;
arr2[0] = 99;
Console.WriteLine(arr1[0]);  // 99 — both point to same array

Output

10
99

Value vs Reference — Exercise 1

Assigning one array to another does not copy the elements — it copies the reference. Both variables then share the same data.

Make an independent copy of the array

Hint

Use Clone() or Array.Copy() to create an independent copy of an array.

What happens when you assign one class instance to another variable?

EX0 Practice — Employee Bonus

From EX0: create Employee with FullName and BaseSalary, then apply bonus percentage.

Fix ApplyBonus logic

Hint

percentage is 10 for 10%, so add salary * (percentage / 100.0).

EX0 Practice — Car Classic Check

A car is considered classic when age is greater than 25 years.

If current year is 2026, is a car from 1998 classic using age > 25?

EX1 Trace — Reference Mutation

EX1 includes examples where methods mutate objects passed as references.

A method receives Test t and executes t.Value = 20; what happens to caller object value?

EX1 Trace — Reassigning Parameter

Distinguish mutating an object from reassigning the local parameter variable.

If Resize(Box b) does b = new Box(); b.Size = 10;, what is caller myBox.Size (starting at 5)?

Bro Code Review — Constructor Purpose

Constructors initialize new objects and can be overloaded for different initialization paths.

When is an instance constructor executed?